home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 101-125 / disk_104 / analyticalc / src / analysrc.arc / AnalyNS.Ftn < prev    next >
Text File  |  1987-10-06  |  83KB  |  3,067 lines

  1. c -h- nextel.fms    Tue Sep  2 10:58:55 1986    
  2.     SUBROUTINE NEXTEL (RETVAL,RETTYP,RETCD)
  3. C COPYRIGHT (C) 1983,1984 GLENN AND MARY EVERHART
  4. C ALL RIGHTS RESERVED
  5. C
  6. C  SCANS LINE(80) FROM NONBLK+1 AND RETURNS THE NEXT ELEMENT.
  7. C  THIS ELEMENT COULD BE A CONSTANT, VALUE OF A VARIABLE, A
  8. C  BINARY FUNCTION CODE, OR A UNARY FUNCTION CODE. UPON RETURN,
  9. C  NONBLK POINTS TO LAST CHARACTER OF NEXT ELEMENT.
  10. C
  11. C  RETCD  =    1  IF OPERAND (VALUE IN RETVAL(100)
  12. C        2  IF OPERATOR (VALUE IN RETTYP)
  13. C        3  NO MORE ELEMENTS
  14. C        4  IF ERROR
  15. C
  16. C  RETVAL  HOLDS VALUE OF OPERAND FOUND (EITHER CONSTANT OR IF
  17. C       A VARIABLE (A-Z,%), THE VALUE OF THAT VARIABLE)
  18. C
  19. C  RETTYP  IS THE TYPE CODE
  20. C NEXTEL CALLS
  21. C
  22. C ERRMSG     PRINTS OUT ERROR MESSAGES
  23. C FLIP       REVERSES THE NON-LEADING ZERO DIGITS IN A VECTOR
  24. C GETNNB     GETS THE NEXT NON-BLANK FROM LINE(80)
  25. C
  26. C NEXTEL IS CALLED BY INPOST
  27. C
  28. C
  29. C    VARIABLE    USE
  30. C    ---------   ----------------------------------
  31. C
  32. C    ALPHA(27)   HOLDS LEGAL VARIABLE NAMES.
  33. C
  34. C    ARROW       '^'
  35. C
  36. C    B10         SWITCH SET WHEN CONSTANT IS NOT OCTAL (MAY BE
  37. C                DECIMAL OR HEX BECAUSE THE DIGIT 8 OR 9 WAS FOUND).
  38. C
  39. C    B16         SWITCH SET WHEN CONSTANT IS HEXADECIMAL BECAUSE
  40. C                DIGIT A, B, C, D, E, OR F WAS FOUND.
  41. C
  42. C    BASE        HOLDS BASE OF CONSTANT.
  43. C
  44. C    CHAR1       HOLDS A SINGLE CHARACTER FROM LINE.
  45. C
  46. C    DEFBAS      THE DEFAULT BASE SPECIFIED.
  47. C
  48. C    DIGITS(16,3) HOLDS ASCII CHARACTERS FOR THE DIGITS OF BASES
  49. C                 8, 10, AND 16.
  50. C
  51. C    DOT          '.'
  52. C
  53. C    EQ           '='
  54. C
  55. C    EXCODE       CODE FOR EXPONENTIATION.
  56. C
  57. C    FCNT         NUMBER OF UNARY FUNCTIONS DEFINED BY VECTOR FUNCT
  58. C
  59. C    FUNCT (NAME,INDXX) HOLDS FUNCTION NAMES.
  60. C
  61. C    FUNVAL(I,J)
  62. C     IF I=1, THE VALUE IS THE NUMBER OF CHARACTERS IN THE J-TH
  63. C             FUNCTION WHOSE NAME IS THE FUNCT(K,J) WHERE K=1,2,3...10
  64. C     IF I=2, THE VALUE IS THE STACK ELEMENT CODE FOR THE J-TH
  65. C             FUNCTION WHOSE NAME IS IN FUNCT(K,J), K=1,2,3...10
  66. C
  67. C
  68. C    I,J,K,L  HOLDS TEMPORARY VALUES
  69. C
  70. C    I1,I2    HOLD VALUE OF DIGITS IN E OR D SPECIFICATION.
  71. C
  72. C    IALPHA   INDEX INTO ALPHA OF THE FIRST NON-BLANK CHARACTER FOUND.
  73. C
  74. C    IHOLD    HOLDS TEMPORARY VALUES
  75. C
  76. C    INT      PICKS UP INTEGER*4 VALUES.
  77. C
  78. C    IPT      POINTER TO ELEMENTS IN LINE(80).
  79. C
  80. C    IPT2     POINTER TO ELEMENTS IN LINE(80).
  81. C
  82. C    LASTOP  USED TO HOLD VALUE OF LAST OPERATOR SO THAT UNARY OPERATORS
  83. C            CAN BE IDENTIFIED IN CASES LIKE A*-B AND A/(-3).
  84. C
  85. C    MINUS   '-'
  86. C
  87. C    OPER(9) HOLDS LEGAL ONE CHARACTER OPERATORS LIKE '+' AND '*'.
  88. C
  89. C    PLUS    '+'
  90. C
  91. C    QUOTE   "'"
  92. C
  93. C    RB      HOLDS NEGATIVE POWERS OF 10.(BASE 10)
  94. C
  95. C    REAL    PICKS UP REAL*8 CONSTANTS.
  96. C
  97. C    RETCD   RETURN CODE:
  98. C              1 IF OPERAND (VALUE IN RETVAL(100))
  99. C              2 IF OPERATOR (VALUE IN RETTYP)
  100. C              3 NO MORE ELEMENTS.
  101. C              4 IF ERROR.
  102. C
  103. C    RETCD2  RETURN CODE WHEN CALLING GETNNB.
  104. C
  105. C    RETPT   INDEXES DIGITS PICKED UP FOR A CONSTANT.
  106. C
  107. C    RETTYP  THE TYPE CODE OF THE RETURNED ELEMENT.
  108. C
  109. C    TYPE    TYPE CODE FOR EACH VARIABLE.
  110. C
  111. C    VBLS    HOLDS VALUE OF VARIABLES.
  112. C
  113. C    VLEN    GIVES LENGTH IN BYTES FOR EACH DATA TYPE.
  114. C
  115. C LASTOP MUST BE SET TO ZERO AT START OF EXPRESSION
  116. C
  117. C
  118.     REAL*8 REAL,RB,ACX,XAC
  119.     INTEGER*4 INT
  120.     EXTERNAL INDX,DFLOAT
  121.     REAL*8 DFLOAT
  122.     InTeGer*4 INDXX
  123.     InTeGer*4 LEVEL,NONBLK,LEND
  124.     InTeGer*4 LASTOP
  125.     InTeGer*4 VIEWSW,BASED,VLEN(9),DEFBAS
  126.     InTeGer*4 TYPE(1,1)
  127.     InTeGer*4 RETCD,RETCD2,RETTYP,EXCODE
  128.     InTeGer*4 B10,B16,RETPT,BASE
  129.     InTeGer*4 FCNT,AHOLD
  130.     InTeGer*4 I,J,K,L,IALPHA,IHOLD,IPT,IPT2,I1,I2
  131. C
  132.     CHARACTER*1 CHAR1,DOT,ARROW,QUOTE,STAR,MINUS,PLUS
  133.     CHARACTER*1 RETVAL(20)
  134. C    REAL*8 RVLF
  135. C    EQUIVALENCE (FVLF,RETVAL(1))
  136.     CHARACTER*1 FUNCT(10,40)
  137.     InTeGer*4   FUNVAL(2,40)
  138.     CHARACTER*1 AVBLS(20,27)
  139.     EQUIVALENCE(XAC,AVBLS(1,27))
  140.     CHARACTER*1 VBLS(8,1,1)
  141.     CHARACTER*1 OPER(9),DIGITS(16,3)
  142.     CHARACTER*1 LINE(80),ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ
  143.     CHARACTER*1 FOUR(4),EIGHT(8)
  144. C
  145.     COMMON /V/ TYPE,AVBLS,VBLS,VLEN
  146.     COMMON /DIGV/ DIGITS
  147.     COMMON  LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  148.     COMMON /CONS/ ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  149. C ***<<< KLSTO COMMON START >>>***
  150.     InTeGer*4 DLFG
  151. C    COMMON/DLFG/DLFG
  152.     InTeGer*4 KDRW,KDCL
  153. C    COMMON/DOT/KDRW,KDCL
  154.     InTeGer*4 DTRENA
  155. C    COMMON/DTRCMN/DTRENA
  156.     REAL*8 EP,PV,FV
  157.     DIMENSION EP(20)
  158.     INTEGER*4 KIRR
  159. C    COMMON/ERNPER/EP,PV,FV,KIRR
  160. c    InTeGer*4 LASTOP
  161. C    COMMON/ERROR/LASTOP
  162.     CHARACTER*1 FMTDAT(9,76)
  163. C    COMMON/FMTBFR/FMTDAT
  164.     CHARACTER*1 EDNAM(16)
  165. C    COMMON/EDNAM/EDNAM
  166.     InTeGer*4 MFID(2),MFMOD(2)
  167. C    COMMON/FRM/MFID,MFMOD
  168.     InTeGer*4 JMVFG,JMVOLD
  169. C    COMMON/FUBAR/JMVFG,JMVOLD
  170.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  171.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  172. C ***<<< KLSTO COMMON END >>>***
  173. CCC    COMMON /ERROR/ LASTOP
  174. C
  175.     EQUIVALENCE (REAL,EIGHT),(FOUR,INT)
  176. C
  177.     DATA DOT/'.'/,ARROW/'^'/,QUOTE/''''/,STAR/'*'/
  178.     DATA MINUS/'-'/,PLUS/'+'/
  179.     DATA OPER/'(','-','!','*','/','+','-',')','='/
  180. C
  181. C  NUMBER OF FUNCTIONS
  182.     DATA FCNT/30/
  183. C
  184.     DATA FUNCT/'A','B','S',' ',' ',' ',' ',' ',' ', ' ',
  185.      1             'D','A','B','S',' ',' ',' ',' ',' ',' ',
  186.      2             'I','A','B','S',' ',' ',' ',' ',' ',' ',
  187.      3             'F','L','O','A','T',5*' ','I','F','I','X',6*' ',
  188.      5             'A','I','N','T',6*' ','I','N','T',7*' ',
  189.      7             'I','D','I','N','T',5*' ','E','X','P',7*' ',
  190.      9             'D','E','X','P',6*' ','A','L','O','G','1','0',4*' ',
  191.      2             'D','L','O','G','1','0',4*' ','A','L','O','G',6*' ',
  192.      4             'D','L','O','G',6*' ','S','Q','R','T',6*' ',
  193.      6             'D','S','Q','R','T',5*' ','S','I','N',7*' ',
  194.      8             'D','S','I','N',6*' ','C','O','S',7*' ',
  195.      1             'D','C','O','S',6*' ','T','A','N','H',6*' ',
  196.      2             'D','T','A','N','H',5*' ','A','T','A','N',6*' ',
  197.      3             'D','A','T','A','N',5*' ',
  198.      1             'A','S','I','N',6*' ','D','A','S','I','N',5*' ',
  199.      2             'A','C','O','S',6*' ','D','A','C','O','S',5*' ',
  200.      3             'T','A','N',' ',6*' ','D','T','A','N',106*' '/
  201.     DATA EXCODE/112/
  202.        DATA FUNVAL/3,31,4,31,4,32,5,33,4,34,4,35,3,36,5,36,3,37,4,37,
  203.      1 6,39,6,39,4,38,4,38,4,40,5,40,3,41,4,41,3,42,4,42,4,43,5,43,
  204.      2       4,44,5,44,4,45,5,45,4,46,5,46,3,47,4,47,20*0/
  205. C
  206. 10    CONTINUE
  207.     CALL GETNNB(IPT,RETCD2)
  208.     IF (RETCD2.EQ.1) GOTO 50
  209. C
  210. C  NO MORE ELEMENTS
  211.     LASTOP=0
  212.     RETCD=3
  213.     RETURN
  214. C
  215. C
  216. C  INITIALIZE VARIABLES
  217. 50    CONTINUE
  218.     B10=0
  219.     B16=0
  220.     RETTYP=0
  221.     RETPT=0
  222.     REAL=0.D0
  223.     RETCD=1
  224.     DEFBAS=BASED
  225. C    RVLF=0.0D0
  226. C COMMENT OUT DO LOOP OVER 20 BYTES FOR SPEED.
  227. C (INSTEAD JUST ZERO 8 BYTES WE WILL LIKELY USE)
  228.     DO 60 I=1,8
  229. C    DO 60 I=1,20
  230. 60    RETVAL(I)=0
  231. C
  232. 70    CHAR1=LINE(IPT)
  233.     NONBLK=IPT
  234. C
  235. C
  236. C  SEE IF ALPHABETIC OR %
  237. C SHORTCUT IF IT'S A CELL NAME .. GO JUST EVALUATE IT.
  238. C ALSO WORKS FOR ENCODED FUNCT NAMES.
  239.     IF(ICHAR(CHAR1).GE.255)GOTO 12000
  240. C SEPARATE OUT FUNCTION CALLS FOR FASTER EXECUTION...SKIP TRYING FUNCT. NAME
  241. C FIRST AS VARIABLE NAME (WHICH CAN TAKE LONG TIME TO CONVERT BEFORE WE DISCOVER
  242. C IT ISN'T NEEDED...)
  243. C
  244.     IF(ICHAR(CHAR1).GE.230)GOTO 13201
  245. C ADD COUPLE MORE SHORTCUTS... DON'T JUST LOOP TO SEE IF WE HAVE
  246. C AN ALPHA CHARACTER...
  247.     IF(CHAR1.NE.ALPHA(27))GOTO 78
  248.     I=27
  249.     GOTO 10000
  250. 78    CONTINUE
  251.     IF(CHAR1.LT.'A'.OR.CHAR1.GT.'Z')GOTO 79
  252. C TRY TO AVOID LOTS OF EXTRA FUNCTION CALLS...
  253. C COMPARE CHARS AS CHARACTER VALUES... SHOULD STILL BE OK.
  254. CCC    IF(ICHAR(CHAR1).LT.ICHAR(ALPHA(1))
  255. CCC     1  .OR.ICHAR(CHAR1).GT.ICHAR(ALPHA(26)))GOTO 79
  256. C USE FACT THAT ASCII CHARACTER CODES ARE IN A CONTINUOUS RANGE
  257. CCC    I=ICHAR(CHAR1)-ICHAR(ALPHA(1))
  258.     I=ICHAR(CHAR1)-65
  259. C 65 IS ASCII VALUE FOR 'A' CHARACTER.
  260. C (HARDCODE FOR SPEED...)
  261.     GOTO 10000
  262. 79    CONTINUE
  263. C DELETE 3 LINES FOLLOWING:
  264. C    DO 80 I=1,27
  265. C    IF (CHAR1.EQ.ALPHA(I)) GOTO 10000
  266. C80    CONTINUE
  267. C
  268. C
  269. C  NOT ALPHA SO SEE IF AN OPERATOR
  270.     DO 100 I=1,9
  271.     IF (CHAR1.EQ.OPER(I)) GOTO 20000
  272. 100    CONTINUE
  273. C
  274. C
  275. C SEE IF AN OPERAND
  276. C *** EVIDENTLY SHORT LOOP RUNS AS FAST AS A COUPLE DECISIONS AND SOME
  277. C MATH; LEAVE IN.
  278. 140    DO 150 I=1,16
  279.     IF (CHAR1.EQ.DIGITS(I,3)) GOTO 30000
  280. 150    CONTINUE
  281. C
  282. C
  283. C
  284.     IF (CHAR1.EQ.DOT) GOTO 40000
  285. C
  286. C
  287. C
  288.     IF (CHAR1.EQ.ARROW) GOTO 300
  289. C
  290. C
  291. C
  292.     IF (CHAR1.EQ.QUOTE) GOTO 200
  293. C
  294. C
  295. C  ADDITIONAL CONSTANT OPERATOR WOULD GO HERE
  296. C
  297. C
  298. C *** ERROR *** ILLEGAL CHARACTER ENCOUNTERED
  299. 190    CALL ERRMSG (20)
  300.     GOTO 99000
  301. C
  302. C
  303. C
  304. C
  305. C **************************************
  306. C ****** ASCII CONSTANT SPECIFIED ******
  307. C **************************************
  308. 200    CONTINUE
  309.     NONBLK=NONBLK+1
  310.     RETVAL(1)=ICHAR(LINE(NONBLK))
  311.     RETTYP=1
  312.     GOTO 35100
  313. C
  314. C
  315. C
  316. C
  317. C **************************************
  318. C ****** IMMEDIATE BASE SPECIFIED ******
  319. C **************************************
  320. 300    CALL GETNNB(IPT,RETCD2)
  321.     IF (RETCD2.EQ.1) GOTO 320
  322. C
  323. C
  324. C *** ERROR *** ILLEGAL BASE SPECIFICATION
  325. 310    CALL ERRMSG(19)
  326.     GOTO 99000
  327. C
  328. C
  329. C  IMMEDIATE BASE SPECIFICATION
  330. 320    CHAR1=LINE(IPT)
  331.     NONBLK=IPT
  332.     IF (CHAR1.EQ.DIGITS(8,3)) GOTO 360
  333.     IF (CHAR1.NE.DIGITS(1,3)) GOTO 310
  334. C
  335. C
  336. C FIRST DIGIT IS 1 SO IMMEDIATE BASE MIGHT BE 10 OR 16
  337.     CALL GETNNB (IPT,RETCD2)
  338.     IF (RETCD2.EQ.2) GOTO 310
  339.     CHAR1=LINE(IPT)
  340.     NONBLK=IPT
  341.     IF (CHAR1.EQ.DIGITS(10,1)) GOTO 365
  342.     IF (CHAR1.NE.DIGITS(6,1)) GOTO 310
  343. C
  344. C
  345. C IMMEDIATE BASE IS 16
  346.     DEFBAS=16
  347.     GOTO 370
  348. C
  349. C
  350. C IMMEDIATE BASE IS 8
  351. 360    DEFBAS=8
  352.     GOTO 370
  353. C
  354. C
  355. C IMMEDIATE BASE IS 10
  356. 365    DEFBAS=10
  357. C
  358. C
  359. C
  360. 370    CALL GETNNB(IPT,RETCD2)
  361.     IF (RETCD2.EQ.2) GOTO 310
  362.     CHAR1=LINE(IPT)
  363.     NONBLK=IPT
  364. C
  365. C
  366. C GO FIND OUT WHAT NUMBER HAS THAT DEFAULT BASE
  367.     GOTO 140
  368. C
  369. C
  370. C
  371. C
  372. C ****************************************************
  373. C ****** SEARCH TO SEE IF A UNARY FUNCTION NAME ******
  374. C ****************************************************
  375. 10000    CONTINUE
  376.     IALPHA=I
  377.     IHOLD=NONBLK
  378. C
  379. C
  380. C SCAN EACH OF THE FUNCTION NAMES.
  381.     DO 10060 I=1,FCNT
  382. C
  383. C K HOLDS NUMBER OF NON-BLANK CHARACTERS IN THE FUNCTION NAME.
  384.     K=FUNVAL(1,I)
  385.     IPT2=IHOLD
  386.     NONBLK=IHOLD
  387.     IF (K.EQ.0) GOTO 10060
  388. C
  389. C
  390. C SCAN EACH LETTER OF THE FUNCTION'S NAME
  391.     DO 10050 J=1,K
  392.     IF (LINE(IPT2).NE.FUNCT(J,I)) GOTO 10060
  393.     IF (J.EQ.K) GOTO 10100
  394.     CALL GETNNB (IPT2,RETCD2)
  395.     IF (RETCD2.EQ.2) GOTO 10060
  396.     NONBLK=IPT2
  397. 10050    CONTINUE
  398.     STOP 10050
  399. C
  400. 10060    CONTINUE
  401. 10070    NONBLK=IHOLD
  402.     GOTO 12000
  403. C
  404. C
  405. C  FUNCTION FOUND (LEAVES NONBLK POINTING AT LAST CHARACTER)
  406. 10100    CONTINUE
  407. C
  408. C
  409. C
  410. C
  411. C **********************************
  412. C ****** UNARY FUNCTION FOUND ******
  413. C **********************************
  414.     RETTYP=ICHAR(CHAR(FUNVAL(2,I)))
  415.     LASTOP=RETTYP
  416.     RETCD=2
  417.     GOTO 99099
  418. C
  419. C
  420. C
  421. C
  422. C
  423. C ********************************
  424. C ****** VARIABLE SPECIFIED ******
  425. C ********************************
  426. 12000    CONTINUE
  427. C
  428. C
  429. C  IALPHA HOLDS INDEX INTO ALPHA OF NAME
  430. C ******&&&&&& REMOVE BLK OF CODE STARTING HERE...
  431. C    CALL GETNNB (IPT,RETCD2)
  432. C    IF (RETCD2.EQ.2) GOTO 12060
  433. CC
  434. CC
  435. CC MAKE SURE NEXT CHARACTER IS NOT ALPHA
  436. C    DO 12050 I=1,27
  437. C    IF (LINE(IPT).EQ.ALPHA(I)) GOTO 12200
  438. C12050    CONTINUE
  439. C *****&&&&& ...ENDING HERE
  440. C ADD BELOW...
  441.     LLB=IPT
  442.     LRB=LEND
  443.     CALL VARSCN(LINE,LLB,LRB,LSTCHR,ID1,ID2,IVALID)
  444. C    IF(IVALID.EQ.0)GOTO 12200
  445. C    IPT=LSTCHR
  446.     IF(IVALID.NE.0.AND.ID2.LE.1.AND.ID1.GT.60)GOTO 13201
  447.     IF(IVALID.NE.0)GOTO 12201
  448. C NOT VALID VARIABLE. SEE IF A 2 + ARGUMENT FUNCTION...
  449. C
  450. C COME HERE DIRECT FOR FUNCTIONS ENCODED...
  451. 13201    CONTINUE
  452.     I=IPT+9
  453.     CALL FNAME(LINE(IPT),I,INDEXF)
  454.     IF(INDEXF.EQ.6.OR.INDEXF.LT.1.OR.INDEXF.GT.26)GOTO 12202
  455. C NOW KNOW THERE IS A FUNCTION THERE, SO HANDLE IT.
  456.     LLAST=LEND-IPT+1
  457.     I=INDX(LINE(IPT),ICHAR(']'))
  458.     IF(I.LE.0.OR.I.GT.LLAST)GOTO 12202
  459.     LRB=I
  460.     LLB=INDX(LINE(IPT),ICHAR('['))
  461.     IF(LLB.LE.0.OR.LLB.GT.LLAST)GOTO 12202
  462.     CALL DOMFCN(LINE(IPT),LLB,LRB,INDEXF,ACX)
  463.     XAC=ACX
  464.     TYPE(1,1)=2
  465.     CALL TYPSET(1,27,TYPE(1,1))
  466. C    TYPE(27,1)=2
  467.     ID1=27
  468.     ID2=1
  469.     LSTCHR=LRB+IPT
  470. C GO AND MERGE AS THOUGH WE JUST GOT A VARIABLE % AND HAD TO
  471. C RETURN ITS VALUE.
  472.     GOTO 12201
  473. C IF NOT VALID FUNCTION REPORT AN ERROR.
  474. 12202    GOTO 12200
  475. 12201    IPT=LSTCHR
  476.     IF(LSTCHR.LT.LEND)IPT=IPT-1
  477.     NONBLK=IPT
  478. C RESET NONBLK ALST SO WE RESET GETNNB TOO...
  479. C WAS IPT=LSTCHR+1
  480. C IPT POINTS AFTER VARIABLE NAME...
  481. C ENSURE NON ALPHA AFTER VARIABLE NAME
  482.     CALL GETNNB(IPT,RETCD2)
  483.     IF(RETCD2.EQ.2) GOTO 12060
  484. C
  485. C IF THE NEXT CHARACTER IS AN = SIGN DON'T RETURN VALUE
  486. C OF VARIABLE, JUST PUT INDEX INTO VBLS INTO LOWER BYTE
  487. C OF RETVAL.
  488.     IF (LINE(IPT).EQ.EQ) GOTO 12100
  489. C
  490. C
  491. C ************************************************
  492. C ****** RETURN VALUE OF VARIABLE SPECIFIED ******
  493. C ************************************************
  494. 12060    CALL TYPGET(ID1,ID2,RETTYP)
  495. C12060    RETTYP=TYPE(ID1,ID2)
  496. C *****&&&&&
  497. C MUST CLAMP TYPES SO EXTENDED VARIABLES CAN'T BE MULT PRCN VRBLS.
  498.     IF(ID1.LE.27.AND.ID2.EQ.1) GOTO 12061
  499.     IF (RETTYP.EQ.5)RETTYP=4
  500.     IF (RETTYP.EQ.6)RETTYP=8
  501.     IF (RETTYP.EQ.7)RETTYP=3
  502. 12061    CONTINUE
  503.     IF(RETTYP.LE.0)GO TO 12080
  504.     K=VLEN(RETTYP)
  505.     DO 12070 I=1,K
  506.     IF(ID1.LE.27.AND.ID2.EQ.1) GOTO 12068
  507. C TRY AND CALL XVBLGT HERE TO GET VALUE ALL AT ONCE
  508. C TO AVOID MULTIPLE ARBITRATION...
  509.     IF(I.EQ.K)CALL XVBLGT(ID1,ID2,RETVAL)
  510. C    CALL VBLGET(I,ID1,ID2,RETVAL(I))
  511. C    RETVAL(I)=VBLS(I,ID1,ID2)
  512.     GOTO 12070
  513. 12068    RETVAL(I)=AVBLS(I,ID1)
  514. 12070    CONTINUE
  515. C
  516. 12080    LASTOP=RETTYP
  517.     GOTO 99099
  518. C
  519. C
  520. C
  521. C *******************************************************
  522. C ****** VARIABLE SPECIFIED BUT FOLLOWED BY = SIGN ******
  523. C *******************************************************
  524. 12100    CONTINUE
  525. C    RETVAL(1)=IALPHA
  526. C    RETTYP=TYPE(IALPHA)
  527.     CALL TYPGET(ID1,ID2,TYPE(1,1))
  528.     CALL RVBOO(RETVAL,ID1,ID2)
  529. C RVBOO JUST STUFFS ID1,ID2 INTO RETVAL ARRAY
  530. C AS 2 INTEGERS.
  531.     RETTYP=TYPE(1,1)
  532.     GOTO 12080
  533. C
  534. C
  535. C
  536. C *** ERROR *** UNIDENTIFIED FUNCTION
  537. 12200    CALL ERRMSG(18)
  538.     GOTO 99000
  539. C
  540. C
  541. C
  542. C
  543. C
  544. C **********************
  545. C ****** OPERATOR ******
  546. C **********************
  547. C
  548. C  I IS INDEX INTO OPER TO TELL WHAT OPERATOR IT IS
  549. 20000    CONTINUE
  550.     RETCD=2
  551.     IF(I.NE.4)GO TO 20050
  552. C
  553. C
  554. C IF AN ASTERISK IS FOUND THE NEXT CHARACTER MUST BE EXAMINED
  555. C TO SEE IF '**' WAS SPECIFIED FOR EXPONENTIATION.
  556.     CALL GETNNB (IPT,RETCD2)
  557.     IF(RETCD2.NE.1)GO TO 99000
  558.     IF (LINE(IPT).NE.STAR) GOTO 20050
  559. C
  560. C
  561. C '**' SPECIFIED (EXPONENTIATION)
  562.     RETTYP=EXCODE
  563.     NONBLK=IPT
  564.     GO TO 12080
  565. C
  566. C
  567. C
  568. C  SET DEFAULT RETTYP FOR OPERATORS
  569. 20050    RETTYP=109+I
  570. C
  571. C
  572. C  CHECK OUT POSSIBLE UNARY OPERATOR "-"
  573.     IF (RETTYP.NE.111) GOTO 20080
  574. C
  575. C
  576. C IF A MINUS IS ENCOUNTERED AND THERE WAS NO PREVIOUS ELEMENT OR
  577. C IF PREVIOUS ELEMENT WAS AN OPERATOR OR = SIGN THEN OPERATOR
  578. C IS UNARY.
  579.     IF (LASTOP.EQ.0.OR.(LASTOP.GE.110.AND.LASTOP.LE.116).OR.
  580.      ;      LASTOP.EQ.200) GOTO 20090
  581. C
  582. C
  583. C  BINARY SUBTRACTION OPERATOR
  584.     RETTYP=116
  585.     GOTO 12080
  586. C
  587. C
  588. C
  589. C SEE IF A '+' SIGN
  590. 20080    IF(RETTYP.NE.115)GO TO 20085
  591. C
  592. C
  593. C DETERMINE IF IT IS A UNARY PLUS
  594.     IF(LASTOP.NE.0.AND.LASTOP.LE.100)GO TO 20085
  595. C
  596. C
  597. C SEE IF LAST OPERATOR WAS ')'
  598.     IF(LASTOP.EQ.117)GO TO 20085
  599. C
  600. C
  601. C UNARY '+' FOUND.
  602.     RETCD=1
  603.     GO TO 10
  604. C
  605. C
  606. C
  607. C RESET LASTOP TO 0 IF LEFT PARENTHESIS IS FOUND (CODE 110)
  608. C IF RETTYP IS FOR =, SET TO PROPER CODE
  609. 20085    IF(RETTYP.EQ.110)GO TO 20090
  610.     IF(RETTYP.EQ.118)RETTYP=200
  611.     GO TO 12080
  612. C
  613. C
  614. C UNARY -
  615. 20090    CONTINUE
  616.     GOTO 99097
  617. C
  618. C
  619. C
  620. C
  621. C
  622. C
  623. C *************************
  624. C ****** NON-DECIMAL ******
  625. C *************************
  626. C
  627. 30000    RETPT=RETPT+1
  628.     IF (RETPT.LE.19) GOTO 30020
  629. C
  630. C
  631. C *** ERROR *** MULTIPLE PRECISION IS LIMITED TO 19 DIGITS
  632. C (ACTUALLY, NO LONGER PRESENT...)
  633.     CALL ERRMSG(22)
  634.     GOTO 99000
  635. C
  636. C
  637. C  I HOLDS INDEX INTO DIGITS THAT WAS A MATCH.
  638. C  SEE IF VALUE OF DIGIT IMPLIES A HIGHER BASE.
  639. 30020    IF (I.NE.16) GOTO 30030
  640.     I=0
  641.     GOTO 30050
  642. 30030    IF (I.EQ.8.OR.I.EQ.9) B10=1
  643.     IF(I.GT.9) B16=1
  644. 30050    RETVAL(RETPT)=CHAR(I)
  645. C
  646. C
  647. C GET NEXT CHARACTER
  648.     CALL GETNNB (IPT,RETCD2)
  649.     IF (RETCD2.NE.1) GOTO 30100
  650.     NONBLK=IPT
  651.     CHAR1=LINE(IPT)
  652.     DO 30070 I=1,16
  653.     IF (CHAR1.EQ.DIGITS(I,3)) GOTO 30000
  654. 30070    CONTINUE
  655.     IF (CHAR1.EQ.DOT) GOTO 40000
  656.     NONBLK=NONBLK-1
  657. 30100    CONTINUE
  658. C
  659.     IF (DEFBAS.EQ.16.OR.B16.EQ.1) GOTO 30200
  660.     IF (DEFBAS.EQ.10.OR.B10.EQ.1) GOTO 30300
  661. C
  662. c add code here to check for non -calc mode and goto 40000 if so
  663. c if defbas.ne.8 and if we're working on a floating number
  664. C
  665. C *****************************
  666. C ****** BASE 8 CONSTANT ******
  667. C *****************************
  668.     BASE=8
  669. C
  670. C
  671. C IF MORE THAN 10 DIGITS IT IS MULTIPLE PRECISION
  672.     IF (RETPT.GT.10) GOTO 30170
  673.     RETTYP=8
  674. C
  675. C
  676. C  CONVERT TO OCTAL, HEX OR INTEGER
  677. 30110    INT=0
  678. 30130    DO 30132 L=1,7
  679.     IF (ICHAR(RETVAL(L)).NE.0) GOTO 30140
  680. 30132    CONTINUE
  681. 30140    DO 30150 I=L,RETPT
  682.     INT=INT*BASE+ICHAR(RETVAL(I))
  683.     RETVAL(I)=0
  684. 30150    CONTINUE
  685.     RETVAL(20)=0
  686. 30155    DO 30160 I=1,4
  687. 30160    RETVAL(I)=FOUR(I)
  688.     GOTO 35100
  689. C
  690. C
  691. C ************************************************
  692. C ****** MULTIPLE PRECISION BASE 8 CONSTANT ******
  693. C ************************************************
  694. 30170    RETTYP=6
  695. 30180    CALL FLIP (RETVAL,8,RETPT)
  696. c was 20 above, not 8 but we shortened stack arrays so shorten this
  697.     GOTO 35100
  698. C
  699. C
  700. C
  701. C *********************
  702. C ****** BASE 16 ******
  703. C *********************
  704. 30200    BASE=16
  705. C
  706. C
  707. C IF MORE THAN 7 DIGITS IT IS MULTIPLE PRECISION.
  708.     IF (RETPT.GT.7) GOTO 30270
  709. C
  710. C
  711. C
  712. C  HEXADECIMAL
  713.     RETTYP=3
  714.     GOTO 30110
  715. C
  716. C
  717. C
  718. C
  719. C ****************************************
  720. C ****** MULTIPLE PRECISION BASE 16 ******
  721. C ****************************************
  722. 30270    RETTYP=7
  723.     GOTO 30180
  724. C
  725. C
  726. C *********************
  727. C ****** BASE 10 ******
  728. C *********************
  729. 30300    BASE=10
  730. C
  731. C
  732. C IF MORE THAN 9 DIGITS IT IS MULTIPLE PRECISION.
  733.     IF (RETPT.GT.9) GOTO 30370
  734. C
  735. C
  736. C  INTEGER
  737.     RETTYP=4
  738.     GOTO 30110
  739. C
  740. C
  741. C ****************************************
  742. C ****** MULTIPLE PRECISION BASE 10 ******
  743. C ****************************************
  744. 30370    RETTYP=5
  745.     GOTO 30180
  746. C
  747. C
  748. C
  749. C
  750. C
  751. C SET LASTOP AND EXIT
  752. 35100    LASTOP=RETTYP
  753.     GOTO 99099
  754. C
  755. C
  756. C *****************************
  757. C ****** REAL OR DECIMAL ******
  758. C *****************************
  759. 40000    IF (B16.NE.1) GOTO 40020
  760. C
  761. C
  762. C *** ERROR ***  '.' MAY ONLY BE USED WITH BASE 10
  763.     CALL ERRMSG(21)
  764.     GOTO 99000
  765. C
  766. C
  767. C
  768. 40020    IF (RETPT.EQ.0) GOTO 40200
  769. C
  770. C
  771. C IGNORE LEADING ZEROES
  772.     DO 40022 L=1,19
  773.     IF (ICHAR(RETVAL(L)).NE.0) GOTO 40030
  774. 40022    CONTINUE
  775. C
  776. C IF ALL ZEROES THE LAST ONE COUNTS!
  777.     L=19
  778. C
  779. C
  780. C CONVERT TO A REAL*8 NUMBER
  781. 40030    CONTINUE
  782.     REAL=0.D0
  783.     DO 40060 I=L,RETPT
  784.     REAL=REAL*10.D0+ICHAR(RETVAL(I))
  785.     RETVAL(I)=0
  786. 40060    CONTINUE
  787. C
  788. C
  789. C  PICK UP FRACTIONAL PART OF REAL (DECIMAL)
  790. 40200    CONTINUE
  791.     RB=1.0D0
  792.     RETTYP=2
  793. 40205    CALL GETNNB (IPT,RETCD2)
  794.     IF (RETCD2.EQ.1) GOTO 40300
  795. C
  796. C IF NO MORE, YOU GOT IT ALL SO GO PLACE VALUE IN RETVAL.
  797.     GOTO 40537
  798. C
  799. C
  800. C
  801. 40300    NONBLK=IPT
  802.     CHAR1=LINE(IPT)
  803.     DO 40320 I=1,10
  804.     IF (CHAR1.EQ.DIGITS(I,1)) GOTO 40330
  805. 40320    CONTINUE
  806.     GOTO 40350
  807. 40330    IF (I.EQ.10) I=0
  808.     RB=0.1D0*RB
  809.     REAL=REAL+DFLOAT(I)*RB
  810.     GOTO 40205
  811. C
  812. C
  813. C CHECK TO SEE IF E OR D EXPONENT SPECIFICATION IS USED.
  814. 40350    IF (CHAR1.EQ.DIGITS(13,3).OR.CHAR1.EQ.DIGITS(14,3)) GOTO 40360
  815.     NONBLK=NONBLK-1
  816.     GO TO 40537
  817. C
  818. C
  819. C *********************************************
  820. C ****** E AND D EXPONENT SPECIFICATIONS ******
  821. C *********************************************
  822. 40360    CONTINUE
  823.     CALL GETNNB(IPT,RETCD2)
  824.     IF (RETCD2.EQ.1) GOTO 40370
  825. C
  826. C
  827. C *** ERROR *** ILLEGAL REAL EXPONENT FIELD SPECIFIED
  828. 40365    CALL ERRMSG (24)
  829.     GOTO 99000
  830. C
  831. C
  832. 40370    CHAR1=LINE(IPT)
  833.     IF (CHAR1.EQ.MINUS) GOTO 40380
  834.     RB=10.D0
  835.     IF (CHAR1.NE.PLUS) GOTO 40400
  836.     GOTO 40390
  837. 40380    RB=0.1D0
  838. C
  839. C
  840. C
  841. 40390    NONBLK=IPT
  842.     CALL GETNNB (IPT,RETCD2)
  843. 40400    IF (RETCD2.GE.2) GOTO 40365
  844.     NONBLK=IPT
  845.     CHAR1=LINE(IPT)
  846.     DO 40450 I=1,10
  847.     IF (CHAR1.EQ.DIGITS(I,1)) GOTO 40480
  848. 40450    CONTINUE
  849.     GOTO 40365
  850. 40480    IF (I.EQ.10) I=0
  851. C
  852. C
  853. C I1 HOLDS 1ST DIGIT OF EXPONENT SPECIFICATION
  854.     I1=I
  855.     CALL GETNNB (IPT,RETCD2)
  856.     IF (RETCD2.GE.2) GOTO 40550
  857.     CHAR1=LINE(IPT)
  858.     NONBLK=IPT
  859.     DO 40500 I=1,10
  860.     IF(CHAR1.EQ.DIGITS(I,1)) GO TO 40520
  861. 40500    CONTINUE
  862.     NONBLK=NONBLK-1
  863.     GOTO 40550
  864. C
  865. C
  866. C I2 HOLDS SECOND DIGIT OF EXPONENT SPECIFICATION.
  867. 40520    IF (I.EQ.10) I=0
  868.     I2=I
  869. C
  870. C
  871. 40530    RETTYP=9
  872.     REAL=REAL*RB**(I1*10+I2)
  873. C
  874. C
  875. C
  876. C ***************************************************
  877. C ****** COPY REAL*8 INTO RETURN VECTOR RETVAL ******
  878. C ***************************************************
  879. 40537    DO 40540 I=1,8
  880. 40540    RETVAL(I)=EIGHT(I)
  881.     GOTO 35100
  882. C
  883. C
  884. C
  885. 40550    I2=I1
  886.     I1=0
  887.     GOTO 40530
  888. C
  889. C
  890. C
  891. C ********************************
  892. C ******* ERROR PROCESSING *******
  893. C ********************************
  894. 99000    CONTINUE
  895.     IV=LEND-NONBLK+1
  896.     CALL VWRT(LINE(NONBLK),IV)
  897. C    WRITE (0,99010) (LINE(I),I=NONBLK,LEND)
  898. C99010    FORMAT (1X,80(A1,\))
  899.     RETCD=4
  900. 99097    LASTOP=0
  901. 99099    RETURN
  902.     END
  903. c -h- pget.for    Tue Sep  2 10:58:55 1986    
  904.     SUBROUTINE PGET(CMDLIN,ICODE,IRTN)
  905. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  906. C SCREEN. ROW 0 IN DISPLAY IS THE 27 ACCUMULATORS A-Z AND %, WITH
  907. C % BEING THE LAST-COMPUTED VALUE FROM THE CALC PROGRAM, WHICH
  908. C KNOWS HOW TO ACCESS THE DATA BUT IS JUST PASSED COMMAND STRINGS
  909. C FROM THE DISK BASED FILE HERE.
  910.     CHARACTER*1 FORM,FVLD,CMDLIN(132)
  911.     INTEGER*4 VNLT
  912.     CHARACTER*1 LET1,LET2,FORM2(128),NMSH(80)
  913.     COMMON/NMSH/NMSH
  914.     REAL*8 XVBLS(1,1)
  915.     INTEGER KPYBAK
  916. C ***<<<< RDD COMMON START >>>***
  917.     InTeGer*4 RRWACT,RCLACT
  918. C    COMMON/RCLACT/RRWACT,RCLACT
  919.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  920.      1  IDOL7,IDOL8
  921. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  922. C     1  IDOL7,IDOL8
  923.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  924. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  925.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  926. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  927. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  928. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  929.     InTeGer*4 KLVL
  930. C    COMMON/KLVL/KLVL
  931.     InTeGer*4 IOLVL,IGOLD
  932. C    COMMON/IOLVL/IOLVL
  933. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  934. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  935.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  936.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  937.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  938. C ***<<< RDD COMMON END >>>***
  939. CCC    InTeGer*4 IOLVL
  940.     INTEGER*4 JVBLS(2,1,1)
  941. CCC    COMMON/IOLVL/IOLVL
  942. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  943. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  944.     DIMENSION FORM(128),FVLD(1,1)
  945.     CHARACTER*1 FVWRK,FVWRK2
  946. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  947. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  948. C SO INITIALLY IGNORE.
  949. C FVLD=2 = CONST NUMERIC ONLY, COMPUTED. =3, CONST, NEEDS CALC.
  950. C
  951. C ROUTINE IN2AS COMPUTES ASCII CHARACTER NAMES OF SUBSCRIPTS IN1,IN2
  952.  
  953. C SO DISPLAY CAN HAVE THEM. IT MUST BE THE INVERSE OF VARSCN.
  954.     CHARACTER*1 LETA
  955. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  956. CCC    InTeGer*4 LLCMD,LLDSP
  957. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  958.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  959.     COMMON/D2R/NRDSP,NCDSP
  960.     InTeGer*4 TYPE(1,1),VLEN(9)
  961.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  962.     REAL*8 XAC,ZAC
  963.     EQUIVALENCE(XAC,AVBLS(1,27)),(ZAC,AVBLS(1,26))
  964.     REAL*8 XXAC,XYAC
  965.     EQUIVALENCE(XXAC,AVBLS(1,24)),(XYAC,AVBLS(1,25))
  966. C ***<<< XVXTCD COMMON START >>>***
  967.     CHARACTER*1 OARRY(100)
  968.     InTeGer*4 OSWIT,OCNTR
  969. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  970. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  971.     InTeGer*4 IPS1,IPS2,MODFLG
  972. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  973.        InTeGer*4 XTCFG,IPSET,XTNCNT
  974.        CHARACTER*1 XTNCMD(80)
  975. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  976. C VARY FLAG ITERATION COUNT
  977.     INTEGER KALKIT
  978. C    COMMON/VARYIT/KALKIT
  979.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  980.     InTeGer*4 RCMODE,IRCE1,IRCE2
  981. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  982. C     1  IRCE2
  983. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  984. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  985. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  986. C RCFGX ON.
  987. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  988. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  989. C  AND VM INHIBITS. (SETS TO 1).
  990.     INTEGER*4 FH
  991. C FILE HANDLE FOR CONSOLE I/O (RAW)
  992. C    COMMON/CONSFH/FH
  993.     CHARACTER*1 ARGSTR(52,4)
  994. C    COMMON/ARGSTR/ARGSTR
  995.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  996.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  997.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  998.      3  IRCE2,FH,ARGSTR
  999. C ***<<< XVXTCD COMMON END >>>***
  1000. CCC    CHARACTER*1 ARGSTR(52,4)
  1001. CCC    COMMON/ARGSTR/ARGSTR
  1002. C    EQUIVALENCE(ARGSTR(1,1),VBLS(1,1,1))
  1003. C USE VBLS ENTRIES THAT WOULD CORRESPOND TO THE UNUSED SPACE
  1004. C IN VBLS ARRAY FOR ACCUMULATORS A-Z TO HOLD UP TO 4 ARGUMENTS
  1005. C FROM A COMMAND < WHICH READS IN SPACE-DELIMITED ARGUMENTS.
  1006. C THIS WILL ALLOW INTERACTIVE ENTRY OF DATA AND AUTO
  1007. C SUBSTITUTION OF ARGUMENTS VIA THE EDit COMMAND.
  1008.     EQUIVALENCE(XVBLS(1,1),VBLS(1,1,1))
  1009.     INTEGER*4 IIRO,IICO,INUMEM
  1010. C NEED SOME BIG VARIABLES FOR SAVING THE MAPPINGS
  1011.     EQUIVALENCE(JVBLS(1,1,1),XVBLS(1,1))
  1012.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  1013. CCC    COMMON/KLVL/KLVL
  1014.     CHARACTER*1 DEFVB(12)
  1015.     COMMON/DEFVBX/DEFVB
  1016. CCC    InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  1017. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE
  1018. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  1019. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  1020. C  AND VM INHIBITS. (SETS TO 1).
  1021. C
  1022. C DISPLAY ARRAY WILL KEEP A COPY OF VARIABLES DISPLAYED AND FORMATS
  1023. C USED LOCALLY WHICH DISPLAY ROUTINE CAN USE TO SEE WHAT ACTUALLY
  1024. C NEEDS TO BE REFRESHED ON SCREEN. DRWV AND DCLV ARE COLS, ROWS OF
  1025. C DISPLAY ACTUALLY USED FOR SCREEN.
  1026.     InTeGer*4 CWIDS(20)
  1027. C CWIDS IS WIDTHS IN CHARACTERS OF COLUMNS ON DISPLAY. NOTE THAT BECAUSE
  1028. C OF PECULIAR INVERSION WHICH I AM TOO LAZY TO CORRECT IT IS DIMENSIONED
  1029. C AS 20 NOT 75.
  1030.     REAL*8 DVS(20,75)
  1031.     INTEGER*4 LDVS(2,20,75)
  1032.     EQUIVALENCE(LDVS(1,1,1),DVS(1,1))
  1033.     CHARACTER*76 CFORM
  1034.     EQUIVALENCE(CFORM(1:1),FORM(1))
  1035.     COMMON /FVLDC/FVLD
  1036. C    CHARACTER*1 DFMTS(10,20,75)
  1037. C 10 CHARACTERS PER ENTRY.
  1038.     COMMON/DSPCMN/DVS,CWIDS
  1039. C ***<<< NULETC COMMON START >>>***
  1040.     InTeGer*4 ICREF,IRREF
  1041. C    COMMON/MIRROR/ICREF,IRREF
  1042.     InTeGer*4 MODPUB,LIMODE
  1043. C    COMMON/MODPUB/MODPUB,LIMODE
  1044.     InTeGer*4 KLKC,KLKR
  1045.     REAL*8 AACP,AACQ
  1046. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  1047.     InTeGer*4 NCEL,NXINI
  1048. C    COMMON/NCEL/NCEL,NXINI
  1049.     CHARACTER*1 NAMARY(20,301)
  1050. C    COMMON/NMNMNM/NAMARY
  1051.     InTeGer*4 NULAST,LFVD
  1052. C    COMMON/NULXXX/NULAST,LFVD
  1053.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  1054.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  1055. C ***<<< NULETC COMMON END >>>***
  1056. CCC    InTeGer*4 ICREF,IRREF
  1057. CCC    COMMON/MIRROR/ICREF,IRREF
  1058. C ENCODE ICREF, IRREF AND CWIDS PAST TITLE IN FIRST LINE
  1059. C (THAT WAY, NOTHING BREAKS IN OTHER PGMS THAT USE THIS)
  1060. C
  1061. C PUT NUMBERS OUT TO FILE
  1062. C USES RELATIVE FORMS TO CURRENT POS.
  1063. C PD = PUT OURT DISPLAY SHEET. PP = PUT OUT PHYSICAL SHEET.
  1064. C ONLY WRITES PHYSICALLY PRESENT DATA.
  1065. C P/D RRR,CCC,FORMULA,VALID,FORMAT
  1066. C N IN 3RD CHR (PPN/PDN) SAVES NUMBERS, ELSE FORMULAS.
  1067.     ICODE=1
  1068.     CLOSE(4)
  1069. 7954    CALL UVT100(1,LLCMD,1)
  1070.     CALL UVT100(12,2,0)
  1071. C ASK FOR FILE NAME
  1072.     CALL VWRT('Enter Filename>',15)
  1073.     III=IOLVL
  1074. C    IF(III.EQ.5)III=0
  1075.     READ(III,7953,END=510,ERR=510)FORM2
  1076. c7952    FORMAT(' Enter filename>\')
  1077. 7953    FORMAT(128A1)
  1078.     DO 6940 II=1,128
  1079.     ILN=129-II
  1080.     IF(ICHAR(FORM2(ILN)).GT.32)GOTO 6941
  1081.     FORM2(ILN)=0
  1082. 6940    CONTINUE
  1083. 6941    CONTINUE
  1084. C ILN IS LENGTH OFLINE NOW.
  1085.     ILN=MIN0(ILN,127)
  1086.     FORM2(ILN+1)=0
  1087.     CALL WASSIG(4,FORM2)
  1088. C NOW ENCODE COL WIDTHS AND ICREF/IRREF
  1089. C SO SAVE/RESTORE OF EXTENDED SHEETS DOESN'T GET
  1090. C MESSED UP.
  1091.     WRITE(CFORM(1:76),8850,ERR=8851)ICREF,IRREF,(CWIDS(III),
  1092.      1  III=1,20),DRWV,DCLV
  1093. 8850    FORMAT(24I3)
  1094.     DO 8855 III=1,80
  1095.     II=ICHAR(NMSH(III))
  1096.     IF(II.LT.32)II=32
  1097. 8855    NMSH(III)=CHAR(II)
  1098. 8851    CONTINUE
  1099.     WRITE(4,6951)NMSH,(FORM(II),II=1,76)
  1100. 6951    FORMAT(80A1,76A1)
  1101. C ADD ABILITY TO SPECIFY MAX DISPL. TO SAVE
  1102.     CALL UVT100(1,LLCMD,1)
  1103.     CALL UVT100(12,2,0)
  1104.     CALL VWRT('Enter max. displ down to save or 0 for all>',43)
  1105.     III=IOLVL
  1106. C    IF(III.EQ.5)III=0
  1107.     READ(III,7978,END=510,ERR=510)LDXM
  1108. 6950    FORMAT(80A1)
  1109. 7978    FORMAT(I7)
  1110.     CALL UVT100(1,LLCMD,1)
  1111.     CALL UVT100(12,2,0)
  1112.     CALL VWRT('Enter max. displcmt right to save or 0 for all>',47)
  1113.     III=IOLVL
  1114. C    IF(III.EQ.5)III=0
  1115.     READ(III,7978,END=510,ERR=510)MDXM
  1116.     IF(MDXM.LE.0)MDXM=12000
  1117.     IF(LDXM.LE.0)LDXM=12000
  1118. C 12000 IS "AN ARBITRARILY LARGE NUMBER TO ASSURE THAT ALL VALID
  1119. C RANGES ARE SAVED". IT MUST BE SMALL ENOUGH TO ASSURE WE DON'T OVERFLOW AN
  1120. C INTEGER THOUGH.
  1121.     IF(CMDLIN(2).NE.'P'.and.CMDLIN(2).GT.' ')GOTO 7950
  1122. C TREAT "P" BY ITSELF AS A SAVE PP TYPE COMMAND (PUT PHYS)
  1123.     DO 7951 ICO=PCOL,301
  1124.     DO 7951 IRO=PROW,60
  1125. C GO DOWN AND RIGHT ONLY. ALLOW MIXING THIS WAY.
  1126. C    IRX=(ICO-1)*60+IRO
  1127.     CALL REFLEC(ICO,IRO,IRX)
  1128.     IDRO=IRO-PROW+1
  1129.     IDCL=ICO-PCOL+1
  1130.     IF(IDRO.GT.LDXM.OR.IDCL.GT.MDXM)GOTO 7951
  1131. C FORM DISPLACEMENT LOCATORS
  1132.     CALL FVLDGT(IRO,ICO,FVLD(1,1))
  1133.     IF(ICHAR(FVLD(1,1)).EQ.0)GOTO 7951
  1134.     CALL WRKFIL(IRX,FORM,0)
  1135.     CALL CE2A(FORM,FORM2)
  1136.     IF(ICHAR(FORM2(119)).EQ.2)FORM2(119)=Char(3)
  1137.     IF(ICHAR(FORM2(119)).EQ.-2)FORM2(119)=Char(253)
  1138.     CALL TYPGET(IRO,ICO,TYPE(1,1))
  1139.     IF(CMDLIN(3).NE.'N')GOTO 5402
  1140.     IF(JCHAR(FVLD(1,1)).LT.0)GOTO 5402
  1141. C ALWAYS WRITE TEXT OUT EVEN IF SAVING NUMERICALLY
  1142. C EMIT NUMBERS, NOT FORMATS **** CHECK 4 OR 2, ASSUME 4=INTEGER
  1143. C INTERNAL PROC TO PRINT NUMERIC VALUES AT 6400
  1144.     LETR='P'
  1145.     ASSIGN 5405 TO INUMEM
  1146. C    GOTO 6400
  1147. 6400    CONTINUE
  1148. C ASSUME LETR IS SET TO GOOD PREFIX LETTER ASCII VALUE
  1149.     CALL XVBLGT(IRO,ICO,XVBLS(1,1))
  1150.     IF(IABS(TYPE(1,1)).EQ.4)WRITE(4,5403)LETR,IDRO,IDCL,
  1151.      1  JVBLS(1,1,1)
  1152. 5403    FORMAT(1A1,I5,',',I5,',',I15)
  1153.     IF(IABS(TYPE(1,1)).NE.4)WRITE(4,5404)LETR,IDRO,IDCL,
  1154.      1  XVBLS(1,1)
  1155. 5404    FORMAT(1A1,I5,',',I5,',',D30.19)
  1156.     GOTO INUMEM,(5405,6406)
  1157. 5402    CONTINUE
  1158. C FIND END OF TEXT IN ARRAY
  1159.     DO 4330 IV=2,110
  1160.     IVVV=113-IV
  1161.     IF(ICHAR(FORM2(IVVV)).GT.32)GOTO 4331
  1162. 4330    CONTINUE
  1163. 4331    CONTINUE
  1164. C SAVE ON PPX IN EFFICIENT FORM.
  1165. C DON'T WRITE OUT TRAILING NULLS.
  1166. C ENSURE FORMAT HAS NO NULLS IN IT.
  1167.     DO 358 IV=120,128
  1168. 358    IF(ICHAR(FORM2(IV)).LT.32)FORM2(IV)=Char(32)
  1169.     IF(CMDLIN(3).EQ.'F')GOTO 6404
  1170. C PPF WILL SAVE FORMULAS ONLY
  1171. C PPA WILL SAVE FORMULAS AND VALUES (AS WILL PPc WHERE c IS
  1172. C ANY CHARACTER EXCEPT N.
  1173.     LETR='p'
  1174. C FLAG NUMERIC SAVE VIA LOWERCASE P HERE
  1175.     ASSIGN 6406 TO INUMEM
  1176. C GO WRITE FIRST LINE NUMERICALLY
  1177.     GOTO 6400
  1178. 6406    CONTINUE
  1179. C NOW HAVE NUMERIC LINE WRITTEN. WRITE THE SECOND LINE OF THE
  1180. C GROUP TO, SO AS NOT TO CONFUSE GRAPHICS PROGRAMS AND THE
  1181. C LIKE.
  1182.     III=JCHAR(FORM2(119))
  1183.     WRITE(4,7956)III,(FORM2(IV),IV=120,128),TYPE(1,1)
  1184. 6404    CONTINUE
  1185. C NOW WRITE OUT FORMULA RECORD.
  1186.     WRITE(4,7955)IDRO,IDCL,(FORM2(IV),IV=1,IVVV)
  1187. 5405    CONTINUE
  1188. C DUMP TO SERIAL FILE IN OUR OWN FORMAT, BUT ALL IN ASCII.
  1189. 7955    FORMAT('P',I5,',',I5,',',128A1)
  1190. C NOTE LONG RECORDS.
  1191.     III=JCHAR(FORM2(119))
  1192.     WRITE(4,7956)III,(FORM2(IV),IV=120,128),TYPE(1,1)
  1193. 7956    FORMAT(I3,',',9A1,',',I5)
  1194. 7951    CONTINUE
  1195. 2751    CONTINUE
  1196. C
  1197. C NOW SAVE NRDSP AND NCDSP MAPPINGS TOO
  1198. C ONLY SAVE MAPPINGS IF 4TH COMMAND CHARACTER IS "M".
  1199. C ... THEY TAKE A LOT OF ROOM.
  1200.     IF (CMDLIN(4).NE.'M') GOTO 6541
  1201.     DO 6540 IRO=DROW,20
  1202.     DO 6540 ICO=DCOL,75
  1203.     IIRO=64000
  1204.     IICO=IIRO
  1205.     IIRO=IIRO+IRO
  1206.     IICO=IICO+ICO
  1207. C NOTE WE MAKE THESE NUMBERS LARGE SO GRAPHING PROGRAMS WON'T TRY
  1208. C TO READ THEM.
  1209. 6955    FORMAT('M',I5,',',I5,',',2I7)
  1210.     WRITE(4,6955,ERR=6541)IIRO,IICO,NRDSP(IRO,ICO),
  1211.      1  NCDSP(IRO,ICO)
  1212. C WRITE A SPECIAL RECORD, FLAGGED BY 'M', TO SAVE A MAPPING CELL
  1213. C NEED A 2ND RECORD TOO; JUST SEND LAST ONE AGAIN.
  1214.     WRITE(4,7956)III,(FORM2(IV),IV=120,128),TYPE(1,1)
  1215. 6540    CONTINUE
  1216. 6541    CONTINUE
  1217.     CLOSE(4)
  1218.     GOTO 9990
  1219. 7950    IF(CMDLIN(2).NE.'D')GOTO 9990
  1220.     DO 7957 ICO=DCOL,75
  1221.     DO 7957 IRO=DROW,20
  1222.     IDRO=IRO-DROW+1
  1223.     IDCL=ICO-DCOL+1
  1224.     IF(IDRO.GT.LDXM.OR.IDCL.GT.MDXM)GOTO 7957
  1225.     NR=NRDSP(IRO,ICO)
  1226.     NC=NCDSP(IRO,ICO)
  1227. C    IRX=(NC-1)*60+NR
  1228.     CALL REFLEC(NC,NR,IRX)
  1229.     CALL FVLDGT(NR,NC,FVLD(1,1))
  1230.     IF(ICHAR(FVLD(1,1)).EQ.0)GOTO 7957
  1231.     CALL WRKFIL(IRX,FORM,0)
  1232.     CALL CE2A(FORM,FORM2)
  1233.     IF(ICHAR(FORM2(119)).EQ.2)FORM2(119)=Char(3)
  1234.     IF(ICHAR(FORM2(119)).EQ.-2)FORM2(119)=Char(253)
  1235.     IF(CMDLIN(3).NE.'N')GOTO 5412
  1236. C EMIT NUMBERS, NOT FORMATS **** CHECK 4 OR 2, ASSUME 4=INTEGER
  1237.     IF(JCHAR(FVLD(1,1)).LT.0)GOTO 5412
  1238. C WRITE LABELS EVEN IF NUMERIC SAVE
  1239.     CALL TYPGET(NR,NC,TYPE(1,1))
  1240.     CALL XVBLGT(NR,NC,XVBLS(1,1))
  1241.     IF(IABS(TYPE(1,1)).EQ.4)WRITE(4,5413)IDRO,IDCL,JVBLS(1,1,1)
  1242. 5413    FORMAT('P',I5,',',I5,',',I15)
  1243.     IF(IABS(TYPE(1,1)).NE.4)WRITE(4,5414)IDRO,IDCL,XVBLS(1,1)
  1244. 5414    FORMAT('P',I5,',',I5,',',D30.19)
  1245.     GOTO 5415
  1246. 5412    CONTINUE
  1247.     WRITE(4,7958)IDRO,IDCL,(FORM2(IV),IV=1,110)
  1248. 5415    CONTINUE
  1249. 7958    FORMAT('D',I5,',',I5,',',128A1)
  1250.     DO 359 IV=120,128
  1251. 359    IF(FORM2(IV).LT.' ')FORM2(IV)=Char(32)
  1252.     III=JCHAR(FORM2(119))
  1253.     WRITE(4,7956)III,(FORM2(IV),IV=120,128),TYPE(1,1)
  1254. 7957    CONTINUE
  1255. C ALLOW SAVE AS NEEDED OF MAPPING
  1256.     GOTO 2751
  1257. C    CLOSE(4)
  1258. 9990    RETURN
  1259. 510    CONTINUE
  1260.     IRTN=1
  1261.     CLOSE(IOLVL)
  1262.     CLOSE(11)
  1263.     OPEN(11,FILE='CON:0/0/100/100/Analy Command')
  1264.     RETURN
  1265.     END
  1266. c -h- pgget.for    Tue Sep  2 10:58:55 1986    
  1267.     SUBROUTINE PGGET(CMDLIN,ICODE,IRTN)
  1268. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  1269. C SCREEN. ROW 0 IN DISPLAY IS THE 27 ACCUMULATORS A-Z AND %, WITH
  1270. C % BEING THE LAST-COMPUTED VALUE FROM THE CALC PROGRAM, WHICH
  1271. C KNOWS HOW TO ACCESS THE DATA BUT IS JUST PASSED COMMAND STRINGS
  1272. C FROM THE DISK BASED FILE HERE.
  1273.     CHARACTER*1 FORM,FVLD,CMDLIN(132)
  1274.     INTEGER*4 VNLT
  1275.     CHARACTER*1 LET1,LET2,FORM2(128),NMSH(80)
  1276.     COMMON/NMSH/NMSH
  1277.     REAL*8 XVBLS(1,1)
  1278.     INTEGER KPYBAK
  1279. C ***<<<< RDD COMMON START >>>***
  1280.     InTeGer*4 RRWACT,RCLACT
  1281. C    COMMON/RCLACT/RRWACT,RCLACT
  1282.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  1283.      1  IDOL7,IDOL8
  1284. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  1285. C     1  IDOL7,IDOL8
  1286.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  1287. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  1288.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  1289. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  1290. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  1291. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  1292.     InTeGer*4 KLVL
  1293. C    COMMON/KLVL/KLVL
  1294.     InTeGer*4 IOLVL,IGOLD
  1295. C    COMMON/IOLVL/IOLVL
  1296. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  1297. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  1298.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  1299.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  1300.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  1301. C ***<<< RDD COMMON END >>>***
  1302. CCC    InTeGer*4 IOLVL
  1303.     INTEGER*4 JVBLS(2,1,1)
  1304.     REAL*8 R8WK
  1305. CCC    COMMON/IOLVL/IOLVL
  1306. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  1307. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  1308.     DIMENSION FORM(128),FVLD(1,1)
  1309.     INTEGER*4 IRRW,ICCL
  1310. C USE BIG NUMBERS SO WE CAN SUBTRACT 64000 AND STILL NOT GET WRAPAROUND.
  1311. C (FOR SAVE/RESTORE OF MAP)
  1312.     CHARACTER*76 CFORM
  1313.     CHARACTER*35 CFORM2
  1314.     EQUIVALENCE(CFORM2(1:1),FORM2(1))
  1315.     EQUIVALENCE(CFORM(1:1),FORM(1))
  1316.     InTeGer*4 NDUM(24)
  1317. C ***<<< NULETC COMMON START >>>***
  1318.     InTeGer*4 ICREF,IRREF
  1319. C    COMMON/MIRROR/ICREF,IRREF
  1320.     InTeGer*4 MODPUB,LIMODE
  1321. C    COMMON/MODPUB/MODPUB,LIMODE
  1322.     InTeGer*4 KLKC,KLKR
  1323.     REAL*8 AACP,AACQ
  1324. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  1325.     InTeGer*4 NCEL,NXINI
  1326. C    COMMON/NCEL/NCEL,NXINI
  1327.     CHARACTER*1 NAMARY(20,301)
  1328. C    COMMON/NMNMNM/NAMARY
  1329.     InTeGer*4 NULAST,LFVD
  1330. C    COMMON/NULXXX/NULAST,LFVD
  1331.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  1332.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  1333. C ***<<< NULETC COMMON END >>>***
  1334. CCC    COMMON/MIRROR/ICREF,IRREF
  1335.     CHARACTER*1 FVWRK,FVWRK2
  1336. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  1337. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  1338. C SO INITIALLY IGNORE.
  1339. C FVLD=2 = CONST NUMERIC ONLY, COMPUTED. =3, CONST, NEEDS CALC.
  1340. C
  1341. C ROUTINE IN2AS COMPUTES ASCII CHARACTER NAMES OF SUBSCRIPTS IN1,IN2
  1342. C SO DISPLAY CAN HAVE THEM. IT MUST BE THE INVERSE OF VARSCN.
  1343. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  1344. CCC    InTeGer*4 LLCMD,LLDSP
  1345. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  1346.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  1347.     EXTERNAL INDX
  1348.     COMMON/D2R/NRDSP,NCDSP
  1349.     InTeGer*4 TYPE(1,1),VLEN(9)
  1350.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  1351.     REAL*8 XAC,ZAC
  1352.     EQUIVALENCE(XAC,AVBLS(1,27)),(ZAC,AVBLS(1,26))
  1353.     REAL*8 XXAC,XYAC
  1354.     EQUIVALENCE(XXAC,AVBLS(1,24)),(XYAC,AVBLS(1,25))
  1355. C ***<<< XVXTCD COMMON START >>>***
  1356.     CHARACTER*1 OARRY(100)
  1357.     InTeGer*4 OSWIT,OCNTR
  1358. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  1359. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  1360.     InTeGer*4 IPS1,IPS2,MODFLG
  1361. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  1362.        InTeGer*4 XTCFG,IPSET,XTNCNT
  1363.        CHARACTER*1 XTNCMD(80)
  1364. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  1365. C VARY FLAG ITERATION COUNT
  1366.     INTEGER KALKIT
  1367. C    COMMON/VARYIT/KALKIT
  1368.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  1369.     InTeGer*4 RCMODE,IRCE1,IRCE2
  1370. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  1371. C     1  IRCE2
  1372. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  1373. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  1374. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  1375. C RCFGX ON.
  1376. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  1377. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  1378. C  AND VM INHIBITS. (SETS TO 1).
  1379.     INTEGER*4 FH
  1380. C FILE HANDLE FOR CONSOLE I/O (RAW)
  1381. C    COMMON/CONSFH/FH
  1382.     CHARACTER*1 ARGSTR(52,4)
  1383. C    COMMON/ARGSTR/ARGSTR
  1384.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  1385.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  1386.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  1387.      3  IRCE2,FH,ARGSTR
  1388. C ***<<< XVXTCD COMMON END >>>***
  1389. CCC    CHARACTER*1 ARGSTR(52,4)
  1390. CCC    COMMON/ARGSTR/ARGSTR
  1391. C    EQUIVALENCE(ARGSTR(1,1),VBLS(1,1,1))
  1392. C USE VBLS ENTRIES THAT WOULD CORRESPOND TO THE UNUSED SPACE
  1393. C IN VBLS ARRAY FOR ACCUMULATORS A-Z TO HOLD UP TO 4 ARGUMENTS
  1394. C FROM A COMMAND < WHICH READS IN SPACE-DELIMITED ARGUMENTS.
  1395. C THIS WILL ALLOW INTERACTIVE ENTRY OF DATA AND AUTO
  1396. C SUBSTITUTION OF ARGUMENTS VIA THE EDit COMMAND.
  1397.     EQUIVALENCE(XVBLS(1,1),VBLS(1,1,1))
  1398.     EQUIVALENCE(JVBLS(1,1,1),XVBLS(1,1))
  1399.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  1400. CCC    COMMON/KLVL/KLVL
  1401.     CHARACTER*1 DEFVB(12)
  1402.     COMMON/DEFVBX/DEFVB
  1403. CCC    InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  1404. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE
  1405. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  1406. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  1407. C  AND VM INHIBITS. (SETS TO 1).
  1408. C
  1409. C DISPLAY ARRAY WILL KEEP A COPY OF VARIABLES DISPLAYED AND FORMATS
  1410. C USED LOCALLY WHICH DISPLAY ROUTINE CAN USE TO SEE WHAT ACTUALLY
  1411. C NEEDS TO BE REFRESHED ON SCREEN. DRWV AND DCLV ARE COLS, ROWS OF
  1412. C DISPLAY ACTUALLY USED FOR SCREEN.
  1413.     InTeGer*4 CWIDS(20)
  1414. C CWIDS IS WIDTHS IN CHARACTERS OF COLUMNS ON DISPLAY. NOTE THAT BECAUSE
  1415. C OF PECULIAR INVERSION WHICH I AM TOO LAZY TO CORRECT IT IS DIMENSIONED
  1416. C AS 20 NOT 75.
  1417.     REAL*8 DVS(20,75)
  1418.     INTEGER*4 LDVS(2,20,75)
  1419.     EQUIVALENCE(LDVS(1,1,1),DVS(1,1))
  1420.     COMMON /FVLDC/FVLD
  1421. CCC    InTeGer*4 NCEL,NXINI
  1422. CCC    COMMON/NCEL/NCEL,NXINI
  1423. C    CHARACTER*1 DFMTS(10,20,75)
  1424. C 10 CHARACTERS PER ENTRY.
  1425.     COMMON/DSPCMN/DVS,CWIDS
  1426. C
  1427. c7952    FORMAT(' Enter filename>\')
  1428. 7953    FORMAT(128A1)
  1429. 6950    FORMAT(80A1)
  1430. 7978    FORMAT(I7)
  1431. 7956    FORMAT(I3,1X,9A1,1X,I5)
  1432.     CLOSE(4)
  1433. 7960    CALL UVT100(1,LLCMD,1)
  1434.     CALL UVT100(12,2,0)
  1435. C GET FILE NAME
  1436.     call Vwrt('Enter Filename>',15)
  1437.     III=IOLVL
  1438. C    IF(III.EQ.5)III=0
  1439.     READ(III,7953,END=510,ERR=510)FORM2
  1440.     DO 6940 II=1,128
  1441.     ILN=129-II
  1442.     IF(ICHAR(FORM2(ILN)).GT.32)GOTO 6941
  1443.     FORM2(ILN)=Char(0)
  1444. 6940    CONTINUE
  1445. 6941    CONTINUE
  1446. C ILN IS LENGTH OFLINE NOW.
  1447.     ILN=MIN0(127,ILN)
  1448.     FORM2(ILN+1)=Char(0)
  1449. C SPECIAL "FAST READ" MODE TO SET UP DATA AREAS ON GETTING OLD SHEETS...
  1450.     NXINI=1
  1451.     LDXM=INDX(FORM2,ICHAR('/'))
  1452. C IF FILE IS FILENAME/M WE WON'T DO IT FAST...
  1453.     IF(LDXM.LE.0.OR.LDXM.GE.ILN)GOTO 8400
  1454.     FORM2(LDXM)=Char(0)
  1455. C TERMINATE AFTER THE / AND SET NXINI TO 0 AGAIN
  1456.     NXINI=0
  1457. 8400    CONTINUE
  1458.     CALL RASSIG(4,FORM2)
  1459.     READ(4,6951,END=7964,ERR=7964)NMSH,FORM
  1460. 6951    FORMAT(80A1,76A1,56A1)
  1461. 6952    FORMAT(24I3)
  1462. C TRY TO DECODE ICREF,IRREF, CWIDS, AND DRWV,DCLV
  1463.     READ(CFORM(1:76),6952,ERR=6953)NDUM
  1464. C IF HERE, THE READ WAS OK (APPARENTLY)
  1465. C FILL IN DEFAULTS IF NOTHING BUT ZEROES REALLY WAS SEEN
  1466. C (OR JUST ALL SPACES)
  1467.     ICREF=NDUM(1)
  1468.     IF(ICREF.LE.0.OR.ICREF.GT.60)ICREF=10
  1469.     IRREF=NDUM(2)
  1470.     IF(IRREF.LE.0.OR.IRREF.GT.300)IRREF=50
  1471. C SET UP CWIDS BUT DEFAULT TO 10 IF NO REAL INFO THERE
  1472.     DO 6954 III=1,20
  1473.     IIVV=NDUM(III+2)
  1474.     IF(IIVV.LT.1.OR.IIVV.GT.100)IIVV=10
  1475.     CWIDS(III)=IIVV
  1476. 6954    CONTINUE
  1477. C RESTORE NUMBER ROWS AND COLS BEING DISPLAYED
  1478. C NOTE WE DO NOT RESTORE THE COMPLETE DISPLAY
  1479. C MAPPING; JUST THE WIDTHS AND NUMBERS OF DISPLAY
  1480. C COLUMNS, AND WE RESTORE THE EXTENDED MAP SO THAT
  1481. C SAVED SHEETS WILL NORMALLY GET BACK THE SAME EXTENDED
  1482. C ADDRESSING THAT HAD BEEN SET UP.
  1483.     DRWV=NDUM(23)
  1484.     IF(DRWV.LT.1.OR.DRWV.GT.20)DRWV=7
  1485.     DCLV=NDUM(24)
  1486.     IF(DCLV.LT.1.OR.DCLV.GT.75)DCLV=20
  1487. 6953    CONTINUE
  1488. C ADD ABILITY TO SPECIFY MAX DISPL. TO SAVE
  1489.     CALL UVT100(1,LLCMD,1)
  1490.     CALL UVT100(12,2,0)
  1491.     CALL VWRT('Enter max. displc. down to restore or 0 for all>',48)
  1492.     III=IOLVL
  1493. C    IF(III.EQ.5)III=0
  1494.     READ(III,7978,END=510,ERR=510)MDXM
  1495.     CALL UVT100(1,LLCMD,1)
  1496.     CALL UVT100(12,2,0)
  1497.     CALL VWRT('Enter max. displc. right to restore or 0 for all>',
  1498.      1  49)
  1499.     READ(III,7978,END=510,ERR=510)LDXM
  1500.     CALL UVT100(1,LLCMD,1)
  1501.     CALL UVT100(12,2,0)
  1502.     CALL VWRT('Enter min. displ. down (1 or more)>',35)
  1503.     READ(III,7978,END=510,ERR=510)MMDXM
  1504.     CALL UVT100(1,LLCMD,1)
  1505.     CALL UVT100(12,2,0)
  1506.     CALL VWRT('Enter min displ. right (1 or more)>',35)
  1507.     READ(III,7978,END=510,ERR=510)LLDXM
  1508.     IF(MDXM.LE.0)MDXM=12000
  1509.     LLDXM=MAX0(1,LLDXM)
  1510.     MMDXM=MAX0(1,MMDXM)
  1511.     IF(LDXM.LE.0)LDXM=12000
  1512.     IF(CMDLIN(4).EQ.'+'.OR.CMDLIN(4).EQ.'-')RCFGX=1
  1513. C ENTER RECALC MANUAL MODE IF ADDING NUMBERS OR SUBT.
  1514. C FROM SAVED SHEET
  1515. C 12000 IS, AS ABOVE, JUST A "BIG" NUMBER.
  1516. 7961    CONTINUE
  1517.     READ(4,7962,END=7964,ERR=7964)LET1,IRRW,ICCL,(FORM2(IV),
  1518.      1  IV=1,110)
  1519. 7962    FORMAT(A1,I5,1X,I5,1X,128A1)
  1520.     DO 4497 IV=1,110
  1521.     IVV=111-IV
  1522.     IF(FORM2(IVV).GT.' ')GOTO 4496
  1523.     FORM2(IVV)=Char(0)
  1524. 4497    CONTINUE
  1525. 4496    CONTINUE
  1526. C ABOVE LOOP ENSURES THAT EXTRA PARTS OF BUFFER NOT IN SAVE FILE ARE
  1527. C ZEROED ON READIN.
  1528.     READ(4,7956,END=7964,ERR=7964)III,(FORM2(IV),IV=120,128),
  1529.      1  KKTYP
  1530.     FORM2(119)=Char(III)
  1531.     IF(LET1.EQ.'M')GOTO 6500
  1532. C M CODE MEANS WE'RE READING THE DISPLAY-TO-PHYSICAL MAP.
  1533. C GO HANDLE IT SPECIALLY, THEN RETURN. FLAGS RECORDS BY
  1534. C ADDING 64000 TO ROW AND COL NUMBERS TO AVOID GETTING
  1535. C GRAPHICS PROGRAMS MESSED UP.
  1536. C  NOTE THAT SAVING THE MAP WAS OPTIONAL AND IS NOT THE
  1537. C DO-NOTHING DEFAULT.
  1538.     IF(ICHAR(FORM2(119)).EQ.2)FORM2(119)=Char(3)
  1539.     IF(JCHAR(FORM2(119)).EQ.-2)FORM2(119)=Char(253)
  1540.     IF(IRRW.LE.0.OR.ICCL.LE.0)GOTO 9990
  1541.     IF(IRRW.GT.LDXM.OR.ICCL.GT.MDXM)GOTO 7961
  1542.     IF(IRRW.LT.LLDXM.OR.ICCL.LT.MMDXM) GOTO 7961
  1543. C PRODUCE NEW ADDRESSES IN PHYSICAL SHEET USING SAVED FILE'S ONES
  1544. C AND CURSOR LOCATION (SINCE WE SAVE/RESTORE RELATIVE TO CURSOR).
  1545. C THIS PROVIDES A SHEET PARTIAL SAVE / MERGE CAPABILITY.
  1546.     NR=IRRW+PROW-LLDXM
  1547.     NC=ICCL+PCOL-MMDXM
  1548.     IF(CMDLIN(2).NE.'D'.AND.LET1.NE.68)GOTO 7963
  1549.     IF(CMDLIN(2).EQ.'P')GOTO 7963
  1550. C GET DISPLAY VERSION...
  1551.     LRR=IRRW+DROW-LLDXM
  1552.     LCC=ICCL+DCOL-MMDXM
  1553.     LRR=MAX0(1,LRR)
  1554.     LCC=MAX0(1,LCC)
  1555.     IF(LRR.GT.DRWV.OR.LCC.GT.DCLV)GOTO 7961
  1556.     NR=NRDSP(LRR,LCC)
  1557.     NC=NCDSP(LRR,LCC)
  1558. 7963    CONTINUE
  1559. C LET1='p'WILL COME HERE TOO. HANDLE IT SINCE IT'S NUMERIC STUFF.
  1560. C    IRX=(NC-1)*60+NR
  1561.     CALL REFLEC(NC,NR,IRX)
  1562.     IF(NR.EQ.0.OR.NC.EQ.0)GOTO 7961
  1563.     FORM2(118)=CHAR(15)
  1564.     DO 7113 IVV=1,128
  1565. 7113    FORM(IVV)=FORM2(IVV)
  1566.     INRW=PROW
  1567.     INCL=PCOL
  1568.     JOUTR=1
  1569.     JOUTC=2
  1570. C A1 = OUT LOCATION FOR INPUT CELL NAMES
  1571.     JRTR=1
  1572.     JRTC=1
  1573.     IF(CMDLIN(3).EQ.'R')CALL RELVBL(FORM,FORM2,JOUTR,JOUTC,
  1574.      1  INRW,INCL,JRTR,JRTC)
  1575. C ALLOW RELOCATION ON LOADING SAVED SHEET IF DESIRED.
  1576.     CALL FVLDST(NR,NC,FORM2(119))
  1577. C    FVLD(NR,NC)=FORM2(119)
  1578.     CALL TYPSET(NR,NC,KKTYP)
  1579. C    TYPE(NR,NC)=KKTYP
  1580.     CALL CA2E(FORM2,FORM)
  1581.     IF(LET1.NE.'p')CALL WRKFIL(IRX,FORM,1)
  1582. C    WRITE(7'IRX)FORM2
  1583.     IF(LET1.NE.'p')GOTO 7961
  1584. C HAVE LOWERCASE 'p' NOW AS NUMERIC SAVE FLAG FOR THIS RECORD.
  1585.     READ(CFORM2(1:35),6408,ERR=7961)XVBLS(1,1)
  1586. 6408    FORMAT(BN,D30.19)
  1587.     CALL XVBLGT(NR,NC,R8WK)
  1588.     IF(CMDLIN(4).EQ.'+')XVBLS(1,1)=XVBLS(1,1)+R8WK
  1589.     IF(CMDLIN(4).EQ.'-')XVBLS(1,1)=R8WK-XVBLS(1,1)
  1590. C IMPLEMENT ADDING AND SUBTRACTING SAVED SHEETS FROM CURRENT.
  1591. C GOES TO RECALC MANUAL MODE SINCE RECALC WOULD MESS UP
  1592. C VALUES; FORMULAS GET UPDATED FROM LAST-READ SHEET NORMALLY.
  1593.     CALL XVBLST(NR,NC,XVBLS(1,1))
  1594.     GOTO 7961
  1595. 6500    CONTINUE
  1596. C HERE READ MAPPINGS
  1597.     IRRW=IRRW-64000
  1598.     ICCL=ICCL-64000
  1599. C RESTORE OFFSETS TO NORMAL RANGE
  1600.     READ(CFORM2(1:35),6501,ERR=7961)II,III
  1601. 6501    FORMAT(2I7)
  1602.     NRDSP(IRRW,ICCL)=II
  1603.     NCDSP(IRRW,ICCL)=III
  1604. C GO BACK FOR MORE. INEFFICIENT STORAGE OF MAP BUT IT'S COMPACT
  1605. C CODE...
  1606.     GOTO 7961
  1607. 7964    CONTINUE
  1608.     CLOSE(4)
  1609. 9990    NXINI=0
  1610.     RETURN
  1611. 510    CONTINUE
  1612.     IRTN=1
  1613.     NXINI=0
  1614.     CLOSE(IOLVL)
  1615.     CLOSE(11)
  1616.     OPEN(5,FILE='CON:0/0/100/100/Analy Command')
  1617.     RETURN
  1618.     END
  1619. c -h- pmtx2.for    Tue Sep  2 10:58:55 1986    
  1620.     SUBROUTINE PMTX2(IRTCD,IMXX,LINE,IBGN,ID1A,ID2A,ID1B,ID2B,
  1621.      1  IDXA,IDXB,IDYA,IDYB,IDBA,IDBB,IDCA,IDCB)
  1622.     CHARACTER*1 LINE(80)
  1623.     CALL GMTX(LINE,IBGN,LSTCHR,ID1A,ID2A,ID1B,
  1624.      1  ID2B,RETCD)
  1625. C GET LOC OF MATRIX A (MUST BE SQUARE)
  1626.     IBGN=LSTCHR+1
  1627.     IF(RETCD.NE.0.OR.IMXX.LE.1)GOTO 1000
  1628.     IF(LINE(LSTCHR).NE.',')GOTO 300
  1629.     CALL GMTX(LINE,IBGN,LSTCHR,IDXA,IDXB,IDYA,
  1630.      1  IDYB,RETCD)
  1631. C GET LOC OF MATRIX X (RESULT).
  1632.     IBGN=LSTCHR+1
  1633.     IF(RETCD.NE.0.OR.IMXX.LE.2)GOTO 1000
  1634.     IF(LINE(LSTCHR).NE.',')GOTO 300
  1635.     CALL GMTX(LINE,IBGN,LSTCHR,IDBA,IDBB,IDCA,
  1636.      1  IDCB,RETCD)
  1637.     IBGN=LSTCHR+1
  1638. C GET LOC OF MATRIX B (AX=B), THE OTHER HALF OF OUR GIVENS
  1639. C IF WE FALL TO HERE, ALL LOOKS OK, SO LEAVE RETCD ALONE.
  1640. C HOWEVER IF ANY ERRS HAVE OCCURRED, RETCD IS ALREADY SET TO 3
  1641. C FOR ERROR...
  1642. 1000    RETURN
  1643. 300    CONTINUE
  1644.     RETCD=3
  1645.     RETURN
  1646.     END
  1647. c -h- postvl.for    Tue Sep  2 10:58:55 1986    
  1648.     SUBROUTINE POSTVL (RETCD)
  1649. C COPYRIGHT (C) 1983 GLENN EVERHART
  1650. C ALL RIGHTS RESERVED
  1651. C 60=MAX REAL ROWS
  1652. C 301=MAX REAL COLS
  1653. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  1654. C VBLS AND TYPE DIMENSIONED 60,301
  1655. C **************************************************
  1656. C *                                                *
  1657.  
  1658. C *      SUBROUTINE  POSTVL (RETCD)                *
  1659. C *                                                *
  1660. C **************************************************
  1661. C
  1662. C
  1663. C  CONVERTS POSTFIX EXPRESSIONS IN STACK 1 TO A VALUE
  1664. C
  1665. C
  1666. C    RETCD    MEANING
  1667. C
  1668. C    1    O.K.
  1669. C    2    ERROR
  1670. C
  1671. C POSTVL CALLS
  1672. C
  1673. C CALBIN    CALCULATES BINARY OPERATIONS
  1674. C CALUN     CALCULATES UNARY OPERATIONS
  1675. C ERRMSG    PRINTS OUT ERROR MESSAGES
  1676. C VAROUT    OUTPUTS THE VALUE OF A VARIABLE
  1677. C
  1678. C
  1679. C
  1680. C
  1681. C POSTVL IS CALLED BY CALC
  1682. C
  1683. C
  1684. C
  1685. C
  1686. C VARIABLE    USE
  1687. C _________ ___________________________
  1688. C
  1689. C    I,K     TEMPORARY VALUES
  1690. C
  1691. C    PT1     POINTS TO TOP ELEMENT IN STACK1
  1692. C
  1693. C    RETCD   RETURN CODE: 1=O.K., 2=ERROR
  1694. C
  1695. C    RETCD2  USED TO HOLD RETURN CODE WHEN CALLS TO
  1696. C            OTHER ROUTINES ARE MADE.
  1697. C
  1698. C    ST1PT   STACK 1 POINTER.
  1699. C
  1700. C    ST2PT   STACK 2 POINTER.
  1701. C
  1702. C    ST1TYP  VECTOR OF TYPES FOR EACH ELEMENT IN STACK 1
  1703. C
  1704. C    ST2TYP  VECTOR OF TYPES FOR EACH ELEMENT IN STACK 2
  1705. C
  1706. C    STACK1  HOLDS ORIGINAL POSTFIX EXPRESSION.
  1707. C
  1708. C    STACK2  USED TO EVALUATE EXPRESSION IN STACK1.
  1709. C
  1710. C    TYPE(27) HOLDS THE DATA TYPE FOR EACH OF THE VARIABLES.
  1711. C
  1712. C    AVBLS(100,27) HOLDS VALUES OF VARIABLES.
  1713. C    VBLS(8,60,301) HOLDS VALUE OF COMPLEXLY-NAMED VARIABLES. 1ST 27 ELEMENTS
  1714. C    ARE PLACE HOLDERS FOR AVBLS; ROUTINES THAT GENERATE DIMENSIONS ID1,ID2
  1715. C    FOR VBLS RETURN DIMENSIONS 1-27,1 FOR A-Z,%. THESE RESULT IN AVBLS
  1716. C    ARRAY BEING USED. VBLS ARRAY (MAX LENGTH 8 BYTES/VARIABLE) IS USED
  1717. C    FOR OTHER VARIABLES WHOSE NAMES ARE <ALPHA><ALPHA><NUM><NUM>
  1718. C    (WITH OPTION FOR ANY REASONABLE # OF ALPHAS AND NUMERICS BUT CLAMPED
  1719. C    AT 60,301 VALUES TO WORK CORRECTLY.)
  1720. C
  1721. C    VIEWSW   VIEW SWITCH:
  1722. C                0 = OFF
  1723. C                1 = DISPLAY COMMANDS
  1724. C                2 = DISPLAY VALUE OF EXPRESSIONS
  1725. C                3 = DISPLAY ALL
  1726. C
  1727. C
  1728. C
  1729. C    SUBROUTINE POSTVL (RETCD)
  1730. C
  1731.     InTeGer*4 LEVEL,NONBLK,LEND
  1732.     InTeGer*4 PT1
  1733.     InTeGer*4 VIEWSW,BASED
  1734.     InTeGer*4 RETCD,RETCD2,VLEN(9)
  1735.     InTeGer*4 TYPE(1,1)
  1736.     InTeGer*4 ST1TYP(40),ST2TYP(40)
  1737.     InTeGer*4 ST1LIM,ST2LIM,ST1PT,ST2PT
  1738.     InTeGer*4 I,K
  1739. C
  1740.     CHARACTER*1 LINE(80)
  1741.     CHARACTER*1 STACK1(8,40), STACK2(8,40),AVBLS(20,27)
  1742.     CHARACTER*1 VBLS(8,1,1)
  1743. C
  1744.     COMMON /STACK/ STACK1,STACK2,ST1PT,ST2PT,ST1TYP,ST2TYP,
  1745.      ;           ST1LIM,ST2LIM
  1746.     COMMON /V/ TYPE,AVBLS,VBLS,VLEN
  1747.     COMMON LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  1748. C
  1749. C
  1750. C
  1751. C
  1752.     RETCD=1
  1753. C
  1754. C
  1755. C IF THERE IS ONE ELEMENT IN STACK1 AND IT IS NOT
  1756. C A NUMBER, THE EXPRESSION IS ILLEGAL (GO TO 95).
  1757.     IF(ST1PT.EQ.2.AND.ST1TYP(1).GT.30)GO TO 95
  1758. C
  1759. C
  1760. 10    IF (ST1PT.GT.2) GOTO 40
  1761.     IF (ST1PT.EQ.1) GOTO 95
  1762. C
  1763. C
  1764. C ***************************************
  1765. C ****** ONLY 1 ELEMENT ON STACK 1 ******
  1766. C ***************************************
  1767.     K=VLEN(ST1TYP(ST1PT-1))
  1768. C
  1769. C
  1770. C COPY INTO VARIABLE %
  1771.     DO 20 I=1,K
  1772. 20    AVBLS(I,27)=STACK1(I,1)
  1773.     CALL TYPSET(27,1,ST1TYP(1))
  1774. C    TYPE(27,1)=ST1TYP(1)
  1775. C
  1776. C
  1777. C OUTPUT VALUE OF %
  1778.     IF (VIEWSW.GT.1) CALL VAROUT(27,1)
  1779.     RETURN
  1780. C
  1781. C
  1782. C  MORE THAN ONE ELEMENT ON STACK1
  1783. 40    CONTINUE
  1784.     IF (ST1TYP(ST1PT-1).LE.30) GOTO 90
  1785.     IF (ST2PT.LE.ST2LIM) GOTO 45
  1786. C
  1787. C
  1788. C *** ERROR *** STACK 2 OVERFLOW
  1789.     CALL ERRMSG(9)
  1790. 43    RETCD=2
  1791.     RETURN
  1792. C
  1793. C
  1794. C
  1795. C
  1796. C ****************************************
  1797. C ****** OPERATOR SO PUT ON STACK 2 ******
  1798. C ****************************************
  1799. 45    ST2TYP(ST2PT)=ST1TYP(ST1PT-1)
  1800.     ST2PT=ST2PT+1
  1801.     ST1PT=ST1PT-1
  1802.     IF(ST1PT.EQ.1)GO TO 95
  1803.     GOTO 40
  1804. C
  1805. C
  1806. C
  1807. C
  1808. C
  1809. C *********************
  1810. C ****** OPERAND ******
  1811. C *********************
  1812. C
  1813. C FIRST BE SURE THAT THERE IS AN OPERATOR INVOLVED ON STACK 2
  1814. C (IF ONLY ONE ELEMENT IN STACK 1 YOU SHOULD NOT BE HERE).
  1815. 90    IF(ST2PT.NE.1)GO TO 110
  1816. C
  1817. C
  1818. C *** ERROR *** ILLLEGAL EXPRESSION
  1819. 95    CALL ERRMSG(8)
  1820.     GO TO 43
  1821. C
  1822. C
  1823. C
  1824. C
  1825. C ENTER HERE AFTER APPLYING AN OPERATOR TO A NUMBER
  1826. 100    IF (ST2PT.EQ.1) GOTO 10
  1827. 110    K=ST2TYP(ST2PT-1)
  1828. C
  1829. C IF A UNARY OPERATOR, GO TO 190
  1830.     IF ((K.GT.30.AND.K.LE.47).OR.K.EQ.111) GOTO 190
  1831. C
  1832. C
  1833. C IF A BINARY OPERATOR, GO TO 170
  1834.     IF (K.GE.110.AND.K.LE.117) GOTO 170
  1835.     IF(K.EQ.200)GO TO 170
  1836. C
  1837. C IF ELEMENT ON STACK2 AT ST2PT-1 IS AN OPERAND, APPLY CALBIN AGAIN
  1838.     IF(K.LE.30) GO TO 180
  1839.     STOP 110
  1840. C
  1841. C
  1842. C
  1843. C
  1844. C ***************************************************************
  1845. C ****** CALBIN CALCULATES THE BINARY VALUE OF AN OPERATOR ******
  1846. C ***************************************************************
  1847. C  UPON ENTRANCE:
  1848. C    OPERAND 1 IS IN STACK 1
  1849. C    OPERAND 2 IS IN STACK 2
  1850. C    OPERATOR IS BELOW OPERAND 2
  1851. C  UPON EXIT RESULT IS ON STACK 1
  1852. C
  1853. C    RETURN CODE    MEANING
  1854. C
  1855. C    1        O.K.
  1856. C    2        OPERATION COMPLETE (RESULT HAS BEEN OUTPUT)
  1857. C    3        ERROR ENCOUNTERED
  1858. C
  1859. C
  1860. 170    CONTINUE
  1861. C
  1862. C
  1863. C FIRST PUT OPERAND 2 ONTO STACK 2
  1864.     PT1=ST1PT-1
  1865.     ST2TYP(ST2PT)=ST1TYP(PT1)
  1866.     K=VLEN(ST2TYP(ST2PT))
  1867.     DO 175 I=1,K
  1868. 175    STACK2(I,ST2PT)=STACK1(I,PT1)
  1869.     ST1PT=ST1PT-1
  1870.     IF(ST1PT.EQ.1)GO TO 95
  1871.     ST2PT=ST2PT+1
  1872. C
  1873. C
  1874. C IF OPERAND 1 IS AN OPERATOR, PUT IT ON STACK 2 (GO TO 45)
  1875.     IF(ST1TYP(ST1PT-1).GT.30) GO TO 45
  1876. 180    CALL CALBIN (RETCD2)
  1877.     GOTO (100,1000,43), RETCD2
  1878.     STOP 180
  1879. C
  1880. C
  1881. C
  1882. C
  1883. C
  1884. C ********************************************************************
  1885. C ****** CALL CALUN TO CALCULATE THE VALUE OF A UNARY OPERATION ******
  1886. C ********************************************************************
  1887. C    OPERATOR IS IN STACK 2
  1888. C    OPERAND IS IN STACK 1
  1889. C    UPON EXIT, OPERATOR IS POPPED OFF STACK 2
  1890. C
  1891. C    RETURN CODE    MEANING
  1892. C
  1893. C    1        O.K.
  1894. C    2        OPERATION COMPLETE (RESULT HAS BEEN OUTPUT)
  1895. C    3        ERROR ENCOUNTERED
  1896. C
  1897. C
  1898. 190    CALL CALUN (RETCD2)
  1899.     GOTO(100,43),RETCD2
  1900.     STOP 190
  1901. C
  1902. C
  1903. 1000    RETURN
  1904.     END
  1905. c -h- prtcon.for    Tue Sep  2 10:58:55 1986    
  1906. C **********************************
  1907. C *                                *
  1908. C *    INTERNAL FUNCTION PRTCON    *
  1909. C *                                *
  1910. C **********************************
  1911. C CALLED BY MOUT ONLY
  1912. C CONVERTS 0 TO APPROPRIATE NUMBER FOR PRINTING WITH VECTOR DIGITS
  1913.     FUNCTION PRTCON(L1,IBASE)
  1914.     InTeGer*4 BASE(3)
  1915.     InTeGer*4 IBASE,K
  1916.     CHARACTER*1 L1,PRTCON,DIGITS(16,3)
  1917.     COMMON /DIGV/ DIGITS
  1918.     DATA BASE /10,8,16/
  1919.     PRTCON=L1
  1920.     IF(L1.EQ.0)PRTCON=CHAR(BASE(IBASE))
  1921.     K=ICHAR(PRTCON)
  1922.     PRTCON=DIGITS(K,IBASE)
  1923.     RETURN
  1924.     END
  1925. c -h- rassig.for    Tue Sep  2 10:58:55 1986    
  1926.     SUBROUTINE RASSIG(IUNIT,NAME)
  1927. C
  1928. C
  1929.     CHARACTER*1 NAME(50)
  1930.     InTeGer*4 IUNIT
  1931. C &&&& MS FTN 3.2
  1932.     LOGICAL LEXIST
  1933. C &&&&
  1934.     CHARACTER*20 WK
  1935.     CHARACTER*1 WK1(20)
  1936.     EQUIVALENCE(WK(1:1),WK1(1))
  1937. C JUST TRY AND NULL FILL A NAME TO USE.
  1938.     DO 1 N=1,20
  1939.     WK1(N)=' '
  1940. 1    CONTINUE
  1941.     DO 2 N=1,20
  1942.     II=ICHAR(NAME(N))
  1943.     IF(II.LT.32)GOTO 3
  1944.     WK1(N)=CHAR(II)
  1945. C1    CONTINUE
  1946. 2    CONTINUE
  1947. 3    CONTINUE
  1948. C CHECK FOR NONEXISTENT FILE FIRST AND CREATE AN EMPTY ONE
  1949. C IF POSSIBLE, THEN CLOSE AND OPEN FOR READ. THIS MAY
  1950. C AVOID CRASHES IF THE FILE ISN'T THERE...
  1951. C MSDOS FORTRAN 3.2 AND LATER FEATURE...
  1952. C &&&&
  1953. C
  1954. C    INQUIRE(FILE=WK,EXIST=LEXIST,ERR=77)
  1955. C
  1956.     INQUIRE(FILE=WK(1:20),EXIST=LEXIST)
  1957.     IF(LEXIST)GOTO 100
  1958. C FILE DOES NOT EXIST, SO CREATE IT HERE.
  1959. C IF CREATE FAILS WE LOSE TOO...
  1960.     CALL UVT100(1,1,1)
  1961.     CALL SWRT('File not found. Attempting to create.',37)
  1962.     OPEN(IUNIT,FILE=WK,STATUS='NEW',ACCESS='SEQUENTIAL',
  1963.      1  FORM='FORMATTED')
  1964.     CLOSE(IUNIT)
  1965. C OPENS AND CLOSES FILE, CREATING A NULL FILE TO READ.
  1966. C WILL GET EOF ON START, BUT THAT'S TOO BAD...
  1967. 100    CONTINUE
  1968. C &&&&
  1969. C IF JUST CALL ASSIGN, ASSUME FOR READ.
  1970.     OPEN(IUNIT,FILE=WK,STATUS='OLD',ACCESS='SEQUENTIAL',
  1971.      1  FORM='FORMATTED')
  1972. 77    CONTINUE
  1973. C ON ERRORS IN INQUIRE, ASSUME AN ILLEGAL DEVICE OR SOMETHING
  1974. C ELSE WEIRD AND JUST DON'T BOTHER WITH THE OPEN.
  1975.     RETURN
  1976.     END
  1977. c -h- recalc.f40    Tue Sep  2 10:58:55 1986    
  1978.     SUBROUTINE RECALC
  1979. C COPYRIGHT (C) 1983,1984,1985,1986 GLENN EVERHART
  1980. C ALL RIGHTS RESERVED
  1981. C RECALCULATE COMMAND
  1982. C RECOMPUTE ALL ELEMENTS OF SPREADSHEET WHERE VALID.
  1983. C PARAMETER 18060=60*301
  1984. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  1985. C SCREEN. ROW 0 IN DISPLAY IS THE 27 ACCUMULATORS A-Z AND %, WITH
  1986. C % BEING THE LAST-COMPUTED VALUE FROM THE CALC PROGRAM, WHICH
  1987. C KNOWS HOW TO ACCESS THE DATA BUT IS JUST PASSED COMMAND STRINGS
  1988. C FROM THE DISK BASED FILE HERE.
  1989.     CHARACTER*1 FORM,FVLD,CMDLIN(132)
  1990.     INTEGER*4 VNLT
  1991. C ***<<< XVXTCD COMMON START >>>***
  1992.     CHARACTER*1 OARRY(100)
  1993.     InTeGer*4 OSWIT,OCNTR
  1994. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  1995. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  1996.     InTeGer*4 IPS1,IPS2,MODFLG
  1997. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  1998.        InTeGer*4 XTCFG,IPSET,XTNCNT
  1999.        CHARACTER*1 XTNCMD(80)
  2000. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  2001. C VARY FLAG ITERATION COUNT
  2002.     INTEGER KALKIT
  2003. C    COMMON/VARYIT/KALKIT
  2004.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  2005.     InTeGer*4 RCMODE,IRCE1,IRCE2
  2006. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  2007. C     1  IRCE2
  2008. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  2009. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  2010. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  2011. C RCFGX ON.
  2012. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  2013. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  2014. C  AND VM INHIBITS. (SETS TO 1).
  2015.     INTEGER*4 FH
  2016. C FILE HANDLE FOR CONSOLE I/O (RAW)
  2017. C    COMMON/CONSFH/FH
  2018.     CHARACTER*1 ARGSTR(52,4)
  2019. C    COMMON/ARGSTR/ARGSTR
  2020.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  2021.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  2022.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  2023.      3  IRCE2,FH,ARGSTR
  2024. C ***<<< XVXTCD COMMON END >>>***
  2025. CCCC    InTeGer*4 FORMFG,RCFGX,PZAP,RCONE,RCMODE,
  2026. CCCC     1  IRCE1,IRCE2
  2027. CCCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,
  2028. CCCC     1  IRCE1,IRCE2
  2029. C ***<<< KLSTO COMMON START >>>***
  2030.     InTeGer*4 DLFG
  2031. C    COMMON/DLFG/DLFG
  2032.     InTeGer*4 KDRW,KDCL
  2033. C    COMMON/DOT/KDRW,KDCL
  2034.     InTeGer*4 DTRENA
  2035. C    COMMON/DTRCMN/DTRENA
  2036.     REAL*8 EP,PV,FV
  2037.     DIMENSION EP(20)
  2038.     INTEGER*4 KIRR
  2039. C    COMMON/ERNPER/EP,PV,FV,KIRR
  2040.     InTeGer*4 LASTOP
  2041. C    COMMON/ERROR/LASTOP
  2042.     CHARACTER*1 FMTDAT(9,76)
  2043. C    COMMON/FMTBFR/FMTDAT
  2044.     CHARACTER*1 EDNAM(16)
  2045. C    COMMON/EDNAM/EDNAM
  2046.     InTeGer*4 MFID(2),MFMOD(2)
  2047. C    COMMON/FRM/MFID,MFMOD
  2048.     InTeGer*4 JMVFG,JMVOLD
  2049. C    COMMON/FUBAR/JMVFG,JMVOLD
  2050.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  2051.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  2052. C ***<<< KLSTO COMMON END >>>***
  2053. CCC    InTeGer*4 DLFG
  2054. CCC    COMMON/DLFG/DLFG
  2055. C DLFG=1 IF D## FORMS HAVE BEEN SEEN, ELSE 0
  2056.     DIMENSION FORM(128),FVLD(1,1)
  2057.     COMMON/FVLDC/FVLD
  2058. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  2059. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  2060. C SO INITIALLY IGNORE.
  2061. C FVLD=-2 OR -3 = DISPLAY FORMULA
  2062. C FVLD=3 NUMERIC, COMPUTE ONCE THEN SET FVLD TO 2
  2063. C FVLD=2 NUMERIC CONSTANT, ALREADY COMPUTED... DO NOT RECOMPUTE.
  2064. C
  2065. C ROUTINE IN2AS COMPUTES ASCII CHARACTER NAMES OF SUBSCRIPTS IN1,IN2
  2066. C SO DISPLAY CAN HAVE THEM. IT MUST BE THE INVERSE OF VARSCN.
  2067. C ***<<<< RDD COMMON START >>>***
  2068.     InTeGer*4 RRWACT,RCLACT
  2069. C    COMMON/RCLACT/RRWACT,RCLACT
  2070.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  2071.      1  IDOL7,IDOL8
  2072. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  2073. C     1  IDOL7,IDOL8
  2074.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  2075. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  2076.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  2077. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  2078. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  2079. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  2080.     InTeGer*4 KLVL
  2081. C    COMMON/KLVL/KLVL
  2082.     InTeGer*4 IOLVL,IGOLD
  2083. C    COMMON/IOLVL/IOLVL
  2084. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  2085. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  2086.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  2087.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  2088.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  2089. C ***<<< RDD COMMON END >>>***
  2090. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  2091. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  2092.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  2093.     COMMON/D2R/NRDSP,NCDSP
  2094.     InTeGer*4 TYPE(1,1),VLEN(9)
  2095.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  2096. CCC    InTeGer*4 RRWACT,RCLACT
  2097. CCC    COMMON/RCLACT/RRWACT,RCLACT
  2098. CCC    InTeGer*4 KDRW,KDCL
  2099. CCC    COMMON /DOT/KDRW,KDCL
  2100.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  2101.     InTeGer*4 PRS,PCS,DRS,DCS
  2102.     PRS=PROW
  2103.     PCS=PCOL
  2104.     DRS=DROW
  2105.     DCS=DCOL
  2106.     IF(RCMODE.EQ.2)GOTO 5500
  2107. C THE FOLLOWING 2 LOOPS DEFINE ORDER OF CALCULATION.
  2108. C HERE THIS IS: OUTER LOOP ON ROWS (ACROSS), INNER LOOP ON COLUMNS (DOWN).
  2109. C NOTE THAT N2 DEFINES THE SHEET. SINCE 1 IS THE ACCUMULATORS, JUST GO THRU
  2110. C FOR THE SHEET, NOT THE AC'S.
  2111.     DO 1 N2=2,RCLACT
  2112.     N1=1
  2113. 220    CONTINUE
  2114. C    DO 2 N1=1,60
  2115. C USE FVPEEK TO CHECK WHERE FIRST CELL TO DO IS HERE. SHOULD BE
  2116. C FASTER THAN STANDARD LOOP METHOD.
  2117. C *** NOTE HOWEVER THAT IT COULD SLOW US UP... DEPENDS ON EFFICIENCY
  2118. C OF FVLDGT AND FVPEEK.
  2119. C  ... NEED BADLY TO SPEED UP FVLDGT AND FVPEEK TO GET THIS LOOP TO RUN FAST.
  2120. CCCC COMMENT 2 LINES OUT WHEN FAST FVLDGT IS IN TO SPEED UP MORE...
  2121. CCCC EXTRA LOGIC IN FVPEEK DOESN'T USUALLY PAY FOR ITSELF...
  2122. CCC    CALL FVPEEK(N1,N2,NN1)
  2123. CCC    N1=NN1
  2124.     CALL FVLDGT(N1,N2,FVLD(1,1))
  2125.     IIFV=JCHAR(FVLD(1,1))
  2126.     IF (IIFV.LE.0) GOTO 2
  2127.     IRRX=(N2-1)*60+N1
  2128. C IF CONSTANT WAS COMPUTED ALREADY, NO NEED TO RECOMPUTE. SKIP IT.
  2129. C NOTE: WE MUST ALWAYS RECOMPUTE IF R COMMAND WAS GIVEN...
  2130.     IF ((RCONE.EQ.0).AND.(ICHAR(FVLD(1,1)).EQ.2)) GOTO 2
  2131.     KDRW=N1
  2132.     KDCL=N2
  2133.     PROW=N1
  2134.     PCOL=N2
  2135. C SEE IF THIS PHYS COL HAS A DISPLAY COL. AND IF SO SET THAT UP.
  2136. C ONLY SET TO DISPLAYED LOCS HERE TO MINIMIZE SEARCH TIME.
  2137. C NEED THIS TO HANDLE D## FORMS...
  2138.     IF (DLFG.EQ.0)GOTO 95
  2139. C IF NEVER HAD A D## FORM FORGET LOOKING FOR DISPLAY LOCS.
  2140.     DO 20 M2=1,DCLV
  2141.     DO 10 M1=1,DRWV
  2142.     M1X=M1
  2143.     M2X=M2
  2144. C LOOK FOR DISPLAY COORDS EVEN IF IN HYPERSPACE
  2145. C WE FIND ONE IF INDEX FROM REFLECT IS SAME AS WHAT
  2146. C WE'RE LOOKING FOR...
  2147.     IF(NRDSP(M1,M2).EQ.N1.AND.NCDSP(M1,M2).EQ.N2)GOTO 9
  2148. 10    CONTINUE
  2149. 20    CONTINUE
  2150. 95    CONTINUE
  2151. C HERE IF CELL NOT DISPLAYED... SEE IF NEEDS DOING IN RI, RE MODES
  2152.     IF(RCMODE.LE.0)GOTO 9
  2153.     IF(PROW.NE.IRCE1.OR.PCOL.NE.IRCE2)GOTO 2
  2154. C SKIP UNLESS ENTER CELL.
  2155. 9    CONTINUE
  2156. C IF NO DISPLAY ROW, LEAVE AT LOW RIGHT...
  2157. C USE SAVED VALUES SO WE DON'T RELY ON DO LOOP INDEX AFTER LOOP END.
  2158.     DROW=M1X
  2159.     DCOL=M2X
  2160.     CALL WRKFIL(IRRX,FORM,0)
  2161. C NOW HAVE THE FORMULA LINE. PASS TO DOENTRY TO HANDLE IT.
  2162.     LFST=1
  2163. C FIND END OF FORMULA FOR MATH ROUTINES TO TRY TO SPEED
  2164. C THEM UP A BIT.
  2165.     DO 56 N=1,109
  2166.     LLST=111-N
  2167.     IF(ICHAR(FORM(LLST-1)).GT.32)GOTO 57
  2168.     FORM(LLST)=Char(0)
  2169. 56    CONTINUE
  2170. 57    CONTINUE
  2171.     FORM(LLST)=Char(0)
  2172.     FORM(111)=Char(0)
  2173. C    IF(ICHAR(FORM(118)).NE.15)GOTO 2
  2174.     CALL DOENTR(FORM,LFST,LLST)
  2175. C IF WE JUST COMPUTED A CONSTANT, FLAG IT COMPUTED AND SKIP IT.
  2176. C    CALL FVLDGT(N1,N2,FVLD(1,1))
  2177.     IF(IIFV.EQ.3)CALL FVLDST(N1,N2,Char(2))
  2178. 2    CONTINUE
  2179.     N1=N1+1
  2180.     IF(N1.LE.RRWACT)GOTO 220
  2181. 1    CONTINUE
  2182.     GOTO 5600
  2183. 5500    CONTINUE
  2184. C RCMODE=2 AND NOT RM MODE
  2185. C (IN RM MODE, RECALC IS NOT CALLED...)
  2186.     DO 1701 M2=1,DCLV
  2187.     DO 1702 M1=1,DRWV
  2188. C TO HANDLE DISPLAY WHEREVER IT MAY BE, FIND ID OF PHYS CELL AND
  2189. C CONVERT TO PHYS ROW, COL AGAIN REGARDLESS OF ALIAS...
  2190. C (NOTE CALC ORDER IS THEREFORE DISPLAY ORDER, NOT SHEET ORDER...)
  2191.     K=NRDSP(M1,M2)
  2192.     KK=NCDSP(M1,M2)
  2193.     CALL REFLECT(KK,K,IV1)
  2194.     NRC=IV1-1
  2195.     N1=MOD(NRC,60)+1
  2196.     N2=((NRC-N1+1)/60)+1
  2197. C COMPUTE PHYS ROW, COL FROM DISPLAY COORDINATES.
  2198. C USE FVPEEK TO CHECK WHERE FIRST CELL TO DO IS HERE. SHOULD BE
  2199. C FASTER THAN STANDARD LOOP METHOD.
  2200. C *** NOTE HOWEVER THAT IT COULD SLOW US UP... DEPENDS ON EFFICIENCY
  2201. C OF FVLDGT AND FVPEEK.
  2202. C  ... NEED BADLY TO SPEED UP FVLDGT AND FVPEEK TO GET THIS LOOP TO RUN FAST.
  2203.     CALL FVLDGT(N1,N2,FVLD(1,1))
  2204.     IIFV=JCHAR(FVLD(1,1))
  2205.     IF (IIFV.LE.0) GOTO 1702
  2206. C FORGET THIS CELL IF NOT A COMPUTABLE ONE...
  2207.     IRRX=IV1
  2208. C IF CONSTANT WAS COMPUTED ALREADY, NO NEED TO RECOMPUTE. SKIP IT.
  2209. C NOTE: WE MUST ALWAYS RECOMPUTE IF R COMMAND WAS GIVEN...
  2210.     IF ((RCONE.EQ.0).AND.(ICHAR(FVLD(1,1)).EQ.2)) GOTO 1702
  2211.     KDRW=N1
  2212.     KDCL=N2
  2213.     PROW=N1
  2214.     PCOL=N2
  2215.     DROW=M1
  2216.     DCOL=M2
  2217.     CALL WRKFIL(IRRX,FORM,0)
  2218. C NOW HAVE THE FORMULA LINE. PASS TO DOENTRY TO HANDLE IT.
  2219.     LFST=1
  2220. C FIND END OF FORMULA FOR MATH ROUTINES TO TRY TO SPEED
  2221. C THEM UP A BIT.
  2222. C (ALSO GUARANTEE WE HAVE LOTS OF NULLS AT END TO TERMINATE INDEX ROUTINES)
  2223.     DO 756 N=1,109
  2224.     LLST=111-N
  2225.     IF(ICHAR(FORM(LLST-1)).GT.32)GOTO 757
  2226.     FORM(LLST)=Char(0)
  2227. 756    CONTINUE
  2228. 757    CONTINUE
  2229.     FORM(LLST)=Char(0)
  2230.     FORM(111)=Char(0)
  2231. C CALL DOENTR TO DO THE ACTUAL COMPUTATION WORK...
  2232.     CALL DOENTR(FORM,LFST,LLST)
  2233. C IF WE JUST COMPUTED A CONSTANT, FLAG IT COMPUTED AND SKIP IT.
  2234.     IF(IIFV.EQ.3)CALL FVLDST(N1,N2,Char(2))
  2235. 1702    CONTINUE
  2236. 1701    CONTINUE
  2237. C END OF COMPUTATION OVER DISPLAYS
  2238. C    GOTO 5600
  2239. 5600    CONTINUE
  2240.     PROW=PRS
  2241.     PCOL=PCS
  2242.     DROW=DRS
  2243.     DCOL=DCOL
  2244. C FORCE FUNCTION WORKS ONCE ONLY.
  2245.     RCONE=0
  2246.     RCMODE=IABS(RCMODE)
  2247. C SET FOR TEMP. RECALC-ALL MODES TO RETURN TO NORMAL.
  2248.     IRCE1=0
  2249.     IRCE2=0
  2250.     RETURN
  2251.     END
  2252. c -h- reflect.f40    Tue Sep  2 10:58:55 1986    
  2253.     SUBROUTINE REFLEC(ID1,ID2,ID)
  2254. C FORM ID OUT OF ID1,ID2 BUT USING REFLECTED VALUES SO THAT
  2255. C RESULT ID IS ALWAYS IN PRIME AREA.
  2256.     InTeGer*4 ID,ID1,ID2,IDD1,IDD2
  2257. C ***<<< NULETC COMMON START >>>***
  2258.     InTeGer*4 ICREF,IRREF
  2259. C    COMMON/MIRROR/ICREF,IRREF
  2260.     InTeGer*4 MODPUB,LIMODE
  2261. C    COMMON/MODPUB/MODPUB,LIMODE
  2262.     InTeGer*4 KLKC,KLKR
  2263.     REAL*8 AACP,AACQ
  2264. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  2265.     InTeGer*4 NCEL,NXINI
  2266. C    COMMON/NCEL/NCEL,NXINI
  2267.     CHARACTER*1 NAMARY(20,301)
  2268. C    COMMON/NMNMNM/NAMARY
  2269.     InTeGer*4 NULAST,LFVD
  2270. C    COMMON/NULXXX/NULAST,LFVD
  2271.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  2272.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  2273. C ***<<< NULETC COMMON END >>>***
  2274. CCC    COMMON/MIRROR/ICREF,IRREF
  2275. C IN RECALC WE MOVE OVER PRIME AREA ONLY AND SEARCH FOR CELLS IN
  2276. C DISPLAY AREA THERE. THIS IMPLIES THAT WE DON'T FIND DISPLAY
  2277. C COORDS OF CELLS IN EXTENDED AREAS THERE.  THEREFORE THE RI AND RE
  2278. C MODES FAIL COMPLETELY THERE. SINCE WE WANT THE SYSTEM TO WORK IN
  2279. C A PREDICTABLE WAY, FORCE RECALC MODE (I.E., R OR RM MODES) THERE TO
  2280. C ALLOW CELLS TO BE COMPUTED.
  2281. C NOTE THAT IF WE ARE IN THE PRIME AREA AND ISSUE AN RE OR RI COMMAND,
  2282. C THAT MODE SHOULD STAY SET SO LONG AS WE STAY THERE SINCE THE RE OR
  2283. C RI MODES WILL INHIBIT COMPUTING OUTSIDE THAT AREA (AS LONG AS NOTHING
  2284. C REFLECTS INTO IT) SO THERE WILL BE NO REASON FOR THIS TO BE CALLED
  2285. C TO REFLECT SOMETHING BACK TO PRIME AREA UNTIL A R COMMAND IS GIVEN
  2286. C OR THE DISPLAY MOVES OFF THE EDGE OF THE PRIME 60 BY 301 AREA.
  2287. C
  2288. C ***<<< XVXTCD COMMON START >>>***
  2289.     CHARACTER*1 OARRY(100)
  2290.     InTeGer*4 OSWIT,OCNTR
  2291. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  2292. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  2293.     InTeGer*4 IPS1,IPS2,MODFLG
  2294. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  2295.        InTeGer*4 XTCFG,IPSET,XTNCNT
  2296.        CHARACTER*1 XTNCMD(80)
  2297. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  2298. C VARY FLAG ITERATION COUNT
  2299.     INTEGER KALKIT
  2300. C    COMMON/VARYIT/KALKIT
  2301.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  2302.     InTeGer*4 RCMODE,IRCE1,IRCE2
  2303. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  2304. C     1  IRCE2
  2305. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  2306. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  2307. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  2308. C RCFGX ON.
  2309. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  2310. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  2311. C  AND VM INHIBITS. (SETS TO 1).
  2312.     INTEGER*4 FH
  2313. C FILE HANDLE FOR CONSOLE I/O (RAW)
  2314. C    COMMON/CONSFH/FH
  2315.     CHARACTER*1 ARGSTR(52,4)
  2316. C    COMMON/ARGSTR/ARGSTR
  2317.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  2318.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  2319.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  2320.      3  IRCE2,FH,ARGSTR
  2321. C ***<<< XVXTCD COMMON END >>>***
  2322. CCC    InTeGer*4 FORMFG,RCFGX,PZAP,RCONE,RCMODE
  2323. CCC    InTeGer*4 IRCE1,IRCE2
  2324. CCC    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,IRCE2
  2325.     IDD1=MAX0(ID1,1)
  2326.     IDD2=ID2
  2327. C ACCEPT TRICK CALLS WITH ID1=0 AS FROM GMSUBS, MTXEQU,
  2328. C AND MDST
  2329.     IF(ID1.LT.1)GOTO 2000
  2330. 4000    CONTINUE
  2331.     IF(IDD2.LE.60)GOTO 1000
  2332.     IDD2=IDD2-60
  2333.     IDD1=IDD1+IRREF
  2334. c    RCMODE=0
  2335. C RI AND RE MODES FAIL OUT OF PRIME AREA SO DISABLE THEM
  2336.     GOTO 4000
  2337. 1000    CONTINUE
  2338.     IF(IDD1.LE.301)GOTO 2000
  2339.     IDD1=IDD1-300
  2340.     IDD2=IDD2+ICREF
  2341. c    RCMODE=0
  2342. C RI AND RE MODES FAIL OUT OF PRIME AREA SO DISABLE THEM
  2343.     GOTO 4000
  2344. 2000    CONTINUE
  2345.     ID=(IDD1-1)*60+IDD2
  2346.     RETURN
  2347.     END
  2348. c -h- relvbl.for    Tue Sep  2 10:58:55 1986    
  2349.     SUBROUTINE RELVBL(LNIN,LNOUT,INRW,INCL,JOUTR,JOUTC,JRTR,JRTC)
  2350. C RELOCATE VARIABLES BELOW/RIGHT OF JRTR,JRTC INTO LNOUT FROM LNIN
  2351. C    PARAMETER CUP=1,ED=11,EL=12
  2352.     CHARACTER*1 NAME(4),NUMBER(6)
  2353.     CHARACTER*1 LNIN,LNOUT
  2354.     CHARACTER*6 NUMBR6
  2355.     EQUIVALENCE(NUMBR6(1:1),NUMBER(1))
  2356.     DIMENSION LNIN(128),LNOUT(128)
  2357. C ***<<<< RDD COMMON START >>>***
  2358.     InTeGer*4 RRWACT,RCLACT
  2359. C    COMMON/RCLACT/RRWACT,RCLACT
  2360.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  2361.      1  IDOL7,IDOL8
  2362. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  2363. C     1  IDOL7,IDOL8
  2364.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  2365. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  2366.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  2367. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  2368. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  2369. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  2370.     InTeGer*4 KLVL
  2371. C    COMMON/KLVL/KLVL
  2372.     InTeGer*4 IOLVL,IGOLD
  2373. C    COMMON/IOLVL/IOLVL
  2374. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  2375. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  2376.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  2377.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  2378.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  2379. C ***<<< RDD COMMON END >>>***
  2380. CCC    InTeGer*4 IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  2381. CCC    COMMON/DOLLR/IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  2382. C    LOGICAL*2 L63,L192,L255,L127,L128
  2383.     LOGICAL*4 L1,L2
  2384. C    InTeGer*4 I63,I192,I255,I127,I128
  2385.     InTeGer*4 I63,I192,I127
  2386.     InTeGer*4 I1,I2
  2387. C    EQUIVALENCE(I63,L63),(I192,L192),(I255,L255)
  2388.     EQUIVALENCE (I1,L1),(I2,L2)
  2389. C    EQUIVALENCE (L127,I127),(L128,I128)
  2390. C    DATA I63/63/,I192/192/,I255/255/,I127/127/,I128/128/
  2391.     DATA I63/63/,I192/192/,I127/127/
  2392.     LI=1
  2393.     LO=1
  2394. C LI = INPUT LOCATION
  2395. C LO=OUTPUT LOCATION
  2396. 100    CONTINUE
  2397. C    IF(LNIN(LI).LT.'A'.OR.LNIN(LI).GT.'Z')GOTO 200
  2398.     LCC=ICHAR(LNIN(LI))
  2399. C IF WE HAVE 255,CODE,CODE THEN RELOCATE IN BINARY...
  2400.     IF(LCC.EQ.255)GOTO 500
  2401.     IF(LCC.LT.65.OR.LCC.GT.89)GOTO 200
  2402. C WE MUST ENSURE VARSCN ALWAYS SEES AN ALPHA AT START.
  2403.     IL1=LI
  2404.     LE=110
  2405.     LSTC=LE
  2406.     CALL VARSCN(LNIN,IL1,LE,LSTC,ID1,ID2,IVLD)
  2407. C AVOID MESSING UP FUNCTION NAMES
  2408.     IF(ID2.EQ.1)IVLD=0
  2409. C    IF(ID2.EQ.1.AND.ID1.LE.27)IVLD=0
  2410.     IF(IVLD.EQ.0)GOTO 200
  2411. C FOUND VARIABLE. NOW GENERATE ASCII ANDSTUFF INTO OUTPUT.
  2412. C FIRST DON'T RELOCATE P## AND D## FORMS.
  2413.     IF(LNIN(LI+1).EQ.'#')GOTO 250
  2414. C RELOCATE NORMAL VARIABLE HERE.
  2415. C
  2416. C THE NEW VARIABLE IS TO BE DIFFERENT ONLY IF (ID1,ID2) HAS
  2417. C ID1.GT.JRTR AND ID2.GT.JRTC
  2418.     IF(ID1.LT.JRTR.OR.ID2.LT.JRTC)GOTO 210
  2419.     IF(ID1.GT.IDOL5.OR.ID2.GT.IDOL6)GOTO 210
  2420. C OK, KNOW NOW THAT WE HAVE TO RELOCATE ALL.
  2421. C THEREFORE ADD THE DIFFERENCE BETWEEN DEST AND SRC TO BOTH
  2422. C AND CLAMP TO VALID DIMENSIONS.
  2423.     IF(IDOL3.NE.0.OR.IDOL1.EQ.0)ID1=ID1+(JOUTR-INRW)
  2424.     IF(IDOL3.NE.0.OR.IDOL2.EQ.0)ID2=ID2+(JOUTC-INCL)
  2425. 906    ID1=MAX0(ID1,1)
  2426.     ID2=MAX0(ID2,1)
  2427. C CAN UNPACK THIS STUFF ALL RIGHT IN EXTENDED WAYS.
  2428.     ID1=MIN0(18060,ID1)
  2429.     ID2=MIN0(18060,ID2)
  2430.  
  2431. 210    CONTINUE
  2432.     CALL IN2AS(ID1,NAME)
  2433. C NAME GETS 4 CHARACTERS TO USE FOR COL. LABEL
  2434.     IL2=ID2-1
  2435.     WRITE(NUMBR6(1:6),1000)IL2
  2436. C    ENCODE(6,1000,NUMBER)IL2
  2437. 1000    FORMAT(I6)
  2438. C NOW NAME AND NUMBER ARRAYS HAVE LETTERS, DIGITS, OR SPACES.
  2439. C THROW OUT SPACES AND COPY THE REST.
  2440.     LI=LSTC
  2441.     DO 202 N=1,4
  2442.     IF(Ichar(NAME(N)).LE.32)GOTO 202
  2443.     LNOUT(LO)=NAME(N)
  2444.     LO=LO+1
  2445.     IF(LO.GT.110)GOTO 300
  2446. 202    CONTINUE
  2447.     IF(IDOL1.GT.0)LNOUT(LO)=36
  2448.     IF(IDOL1.GT.0.AND.LO.LE.109)LO=LO+1
  2449.     DO 203 N=1,6
  2450.     IF(ICHAR(NUMBER(N)).LE.32)GOTO 203
  2451. C IF 32 ISN'T SPACE, LOSE
  2452.     LNOUT(LO)=NUMBER(N)
  2453.     LO=LO+1
  2454.     IF(LO.GT.110)GOTO 300
  2455. 203    CONTINUE
  2456.     IF(IDOL2.EQ.0)GOTO 300
  2457.     LNOUT(LO)=CHAR(36)
  2458.     IF(LO.LE.109)LO=LO+1
  2459.     GOTO 300
  2460. 250    CONTINUE
  2461. C JUST COPY DISPLAY FORMS.
  2462.     IL1=LSTC-1
  2463.     DO 251 N=LI,IL1
  2464.     LNOUT(LO)=LNIN(N)
  2465.     LO=LO+1
  2466.     IF(LO.GT.110)GOTO 300
  2467. 251    CONTINUE
  2468.     LI=LSTC
  2469. C THIS SKIPS OVER THE VARIABLE FOUND, SO WE GO ON.
  2470.     GOTO 300
  2471. 200    LNOUT(LO)=LNIN(LI)
  2472.     LO=LO+1
  2473.     LI=LI+1
  2474. 300    IF(LO.LT.109.AND.LI.LT.109)GOTO 100
  2475. C THIS LOOPS EITHER COPYING LINE OR FINDING VARIABLES TILL DONE.
  2476.     LO=MIN0(LO,110)
  2477.     DO 400 N=LO,110
  2478. 400    LNOUT(N)=0
  2479.     DO 1 N=111,128
  2480. 1    LNOUT(N)=LNIN(N)
  2481. C DEFAULT ALL OF FORM LINES EXCEPT FORMULA IDENTICAL TO THE INPUT.
  2482.     RETURN
  2483. 500    CONTINUE
  2484. C DECODE BY HAND...
  2485.     LNOUT(LO)=LNIN(LI)
  2486.     I1=ICHAR(LNIN(LI+1))
  2487.     I2=IMASK(I1,I192)
  2488. C    L2=L1.AND.L192
  2489.     I1=IMASK(I1,I63)
  2490. C    L1=L1.AND.L63
  2491. C DO MASKING TO GET BINARY COORDS
  2492.     ID1=I1
  2493.     I1=ICHAR(LNIN(LI+2))
  2494.     I1=IMASK(I1,I127)
  2495. C    L1=L1.AND.L127
  2496.     ID2=I2*2+I1
  2497. C NOW RELOCATE AND PUT BACK
  2498.     IF(ID1.LT.JRTR.OR.ID2.LT.JRTC)GOTO 510
  2499.     IF(ID1.GT.IDOL5.OR.ID2.GT.IDOL6)GOTO 510
  2500.     IF(IDOL3.NE.0.OR.IDOL1.EQ.0)ID1=ID1+(JOUTR-INRW)
  2501.     IF(IDOL3.NE.0.OR.IDOL2.EQ.0)ID2=ID2+(JOUTC-INCL)
  2502. C CLAMP RESULT TO MAX RANGES
  2503.     ID1=MAX0(ID1,1)
  2504.     ID2=MAX0(ID2,1)
  2505. C DO GENERAL REPACK IF ID1 OR ID2 ARE EXTENDED RANGE.
  2506.     IF(ID1.GT.60.OR.ID2.GT.301)GOTO 905
  2507. C    ID1=MIN0(60,ID1)
  2508. C    ID2=MIN0(301,ID2)
  2509. 510    CONTINUE
  2510. C RELOCATED, NOW REPACK AS NEW BINARY PATTERNS
  2511.     I1=ID1
  2512. C    L1=L1.AND.L63
  2513.     I1=IMASK(I1,I63)
  2514.     I2=ID2/2
  2515.     I2=IMASK(I2,I192)
  2516. C    L2=L2.AND.L192
  2517. C    L1=L1.OR.L2
  2518.     I1=I1+I2
  2519.     LNOUT(LO+1)=CHAR(I1)
  2520.     I2=ID2
  2521.     I2=IMASK(I2,I127)+128
  2522. C    L2=L2.AND.L127
  2523. C    L2=L2.OR.L128
  2524. C BE SURE AT LEAST 1 BIT IS SET
  2525.     LNOUT(LO+2)=CHAR(I2)
  2526.     LI=MIN0(109,LI+3)
  2527.     LO=MIN0(109,LO+3)    
  2528. C GO LOOK FOR MORE TO DECODE
  2529.     GOTO 300
  2530. 905    CONTINUE
  2531. C HERE SET UP FOR REENTRY INTO "NORMAL" DECODE
  2532.     LSTC=MIN0(109,LI+3)
  2533.     GOTO 906
  2534.     END
  2535. c -h- rnd.for    Tue Sep  2 10:58:55 1986    
  2536.     FUNCTION RND(DUM)
  2537. C GENERATE RANDOM NUMBER BY LINEAR CONGRUENCE IN BIG
  2538. C INTEGERS.
  2539.     REAL*4 R
  2540.     INTEGER*4 DUM
  2541.     INTEGER*4 I,II
  2542.     LOGICAL*4 L,LMSK
  2543.     REAL*8 XX
  2544.     EQUIVALENCE(I,L),(II,LMSK)
  2545.     I=DUM
  2546.     XX=I
  2547.     XX=XX*214013.0D0+2531011.0D0
  2548.     IF(XX.LT.0.)XX=1.0D0-XX
  2549.     XX=DMOD(XX,16777216.0D0)
  2550.     I=IDINT(XX)
  2551. C    I=I*214013+2531011
  2552. C USE MASKING TO ZOT THIS INTO NORMAL RANGE
  2553. C JUST USE MODULO...
  2554.     IF(I.LT.0)I=1-I
  2555.     IF(I.LT.0)I=0
  2556.     I=MOD(I,16777215)
  2557.     DUM=I
  2558. C RETURN RANDOM BETWEEN 0 AND 1.0
  2559. C PERIOD OF 2**24 MAX
  2560.     XX=I
  2561.     XX=XX/16777216.0
  2562.     R=SNGL(XX)
  2563.     RND=R
  2564.     RETURN
  2565.     END
  2566. c -h- rvboo.for    Tue Sep  2 10:58:55 1986    
  2567.     SUBROUTINE RVBOO(RETV,ID1,ID2)
  2568. C THIS ROUTINE ONLY COPIES ID1,ID2 INTO RETV ARRAY TO AVOID SOME
  2569. C BYTE-INTEGER CONVERSION PROBLEMS. THIS PACKING IS USED TO
  2570. C ACCESS VARIABLE LOCATION LATER.
  2571.     InTeGer*4 RETV,ID1,ID2
  2572.     DIMENSION RETV(2)
  2573.     RETV(1)=ID1
  2574.     RETV(2)=ID2
  2575.     RETURN
  2576.     END
  2577. c -h- scmp.for    Tue Sep  2 10:58:55 1986    
  2578.     SUBROUTINE SCMP(LINA,LINB,LENM,ICODE)
  2579.     DIMENSION LINA(1),LINB(1)
  2580.     CHARACTER*1 LINA,LINB
  2581.     ICODE=1
  2582.     DO 1 N=1,LENM
  2583.     IF(ICHAR(LINA(N)).EQ.0.OR.ICHAR(LINB(N)).EQ.0)GOTO 2
  2584. C ALLOW _ TO BE A WILDCARD.
  2585.     IF(LINA(N).EQ.'_'.OR.LINB(N).EQ.'_')GOTO 1
  2586.     IF(LINA(N).NE.LINB(N))ICODE=0
  2587.     IF(ICODE.NE.1)GOTO 2
  2588. 1    CONTINUE
  2589. 2    CONTINUE
  2590.     RETURN
  2591.     END
  2592. c -h- sed.for    Tue Sep  2 10:58:55 1986    
  2593.     SUBROUTINE SED(LCMD,LIN,LWRK,ARGSTR,XAC,LENGTH)
  2594.     CHARACTER*1 LIN(1),LWRK(1),ARGSTR(52,4)
  2595.     CHARACTER*1 LCMD(1),LSU(10)
  2596.     EXTERNAL INDX
  2597.     CHARACTER*10 LSU10
  2598.     EQUIVALENCE (LSU10(1:10),LSU(1))
  2599.     INTEGER*4 III
  2600.     REAL*8 XAC
  2601. C
  2602. C OPERATION:
  2603. C EDIT LIN TO LWRK, WITH LENGTH VARIABLE HOLDING INPUT
  2604. C LENGTH IN CHARACTERS. LCMD HOLDS COMMAND LINE, WHICH
  2605. C ULTIMATELY GETS EDITED STRING COPIED BACK INTO IT.
  2606. C
  2607. C EDITS:
  2608. C  CHARACTER AT IDELIM IS DELIMITER. REPLACE STRING IN 1ST
  2609. C INTERVAL BETWEEN DELIMITERS WITH SECOND.
  2610. C  HOWEVER:
  2611. C  &1 TO &4 GET CONTENTS (UP TO NULL) OF ARGSTR(X,1) TO (X,4)
  2612. C
  2613. C  &5 RETURNS XAC VALUE CONVERTED TO DECIMAL INTEGER AND
  2614. C  PRINTED.
  2615. C  &6 RETURNS XAC VALUE CONVERTED TO ASCII CODE (1 BYTE) AND
  2616. C  INSERTED.
  2617. C XAC ENTERS WITH CONTENTS OF ACCUMULATOR Z (TO AVOID TOO MUCH
  2618. C DIFFICULTY IN USING IT OWING TO THE UBIQUITY OF USE OF %).
  2619. C    WE ENTER JUST POINTING AT THE COMMAND LINE AFTER THE ENTER
  2620. C AND ITS SPACE. ASSUME 1ST CHARACTER IS OUR DELIMITER.
  2621.     DO 335 IV=1,80
  2622. 335    LWRK(IV)=0
  2623.     IDELIM=ICHAR(LCMD(1))
  2624.     ID2=INDX(LCMD(2),IDELIM)
  2625.     IF(ID2.GE.LENGTH)GOTO 100
  2626. C NOW HAVE 1ST STRING, OF NONZERO LENGTH
  2627. C FIND SECOND STRING NOW. EITHER MAY BE OF 0 LENGTH BUT
  2628. C BOTH MUST BE DEFINED BY A DELIMITER.
  2629.     ID3=INDX(LCMD(2+ID2),IDELIM)
  2630.     IF(ID3.GE.LENGTH)GOTO 100
  2631. C WELL, WE GOT IT SOMEHOW. NOW TRY AND EDIT THE JUNK IN.
  2632. C (NOTE WE WANT TO FILL ALL OF LENGTH)
  2633.     INLIN=1
  2634.     INWRK=1
  2635.     IVV=ID3+ID2+2
  2636.     DO 336 IV=IVV,LENGTH
  2637. 336    LCMD(IV)=0
  2638.     LSA=ID2-1
  2639.     LSB=ID3-1
  2640.     LSSB=2+ID2
  2641.     LZR=0
  2642.     DO 1 N=1,LENGTH
  2643.     IF(LSA.GT.0)GOTO 350
  2644. C ZERO LENGTH INITIAL STRING, SO ASSUME HE WANTS TO APPEND TO
  2645. C EXISTING STRING AT THE END.
  2646. C (HANDY FOR ADDING TO FORMULAE OR THE LIKE.)
  2647.     IF(LIN(N).EQ.0)GOTO 351
  2648. C JUST COPY THE INPUT FIRST AND GO OFF
  2649.     GOTO 2
  2650. 351    CONTINUE
  2651. C HERE WE HAVE THE TERMINAL NULL
  2652.     LZR=LZR+1
  2653. C ALLOW US TO PRETEND FOR ONCE THAT WE GOT A MATCH
  2654.     IF(LZR.EQ.1)GOTO 222
  2655.     GOTO 1
  2656. 350    CONTINUE
  2657.     IF(LIN(INLIN).EQ.0)GOTO 1
  2658.     CALL SSCMP(LIN(INLIN),LCMD(2),LSA,ICOD)
  2659.     IF(ICOD.EQ.0)GOTO 2
  2660. C HERE HAVE TO SUBSTITUTE
  2661. C PASS STRING TO SUBSTITUTE ON INPUT LINE FIRST.
  2662. 222    CONTINUE
  2663.     INLIN=INLIN+LSA
  2664. C ALLOW ZERO LENGTH SUBSTITUTE CHARACTER
  2665.     IF(LSB.LE.0)GOTO 1
  2666. C    DO 6 M=1,LSB
  2667.     M=1
  2668. 106    CONTINUE
  2669.     IF(LCMD(LSSB+M-1).EQ.'&')GOTO 7
  2670. 8    CONTINUE
  2671. C JUST COPY ONE CHARACTER OF THE SUBSTITUTE STRING IN HERE.
  2672.     LWRK(INWRK)=LCMD(LSSB+M-1)
  2673.     IF(INWRK.LT.LENGTH)INWRK=INWRK+1
  2674.     GOTO 6
  2675. 7    CONTINUE
  2676. C HANDLE & FORMS
  2677.     IF(LCMD(LSSB+M).LT.'1'.OR.LCMD(LSSB+M).GT.'6')GOTO 8
  2678. C REQUIRE ALL FORMS TO BE &1 THRU &6 TO BE DEALT WITH HERE.
  2679.     M=M+1
  2680.     IF(LCMD(LSSB+M-1).GT.'4')GOTO 10
  2681. C HERE JUST HANDLE ARGSTR SUBSTITUTIONS.
  2682.     II=ICHAR(LCMD(LSSB+M-1))
  2683.     II=II-48
  2684. C II IS NOW THE INDEX.
  2685.     DO 11 MM=1,52
  2686.     LWRK(INWRK)=ARGSTR(MM,II)
  2687.     IF(INWRK.LT.LENGTH)INWRK=INWRK+1
  2688.     IF(ARGSTR(MM,II).EQ.0)GOTO 12
  2689. 11    CONTINUE
  2690. 12    CONTINUE
  2691.     M=M+1
  2692. C PASS THE NUMBER OF THE &NUMBER FORM
  2693.     GOTO 6
  2694. 10    CONTINUE
  2695. C HANDLE ZAC FORMS
  2696.     M=M+1
  2697. C PASS THE DIGIT
  2698.     IF(LCMD(LSSB+M-2).EQ.'5')GOTO 14
  2699. C FILL IN ZAC AS AN INTEGER
  2700.     II=32
  2701.     IF(XAC.GE.1.AND.XAC.LT.256.)II=XAC
  2702. C ONLY HANDLE CONVERSION IF LEGAL
  2703.     LWRK(INWRK)=CHAR(II)
  2704.     IF(INWRK.LT.LENGTH)INWRK=INWRK+1
  2705.     GOTO 6
  2706. 14    CONTINUE
  2707. C HANDLE NUMERIC CONVERSION HERE
  2708.     LSU(1)=0
  2709.     III=0
  2710.     IF(DABS(XAC).LT.9999999.)III=IDINT(XAC)
  2711.     WRITE(LSU10(1:10),15,ERR=22)III
  2712. C    ENCODE(10,15,LSU,ERR=22)III
  2713. 15    FORMAT(I9)
  2714. 22    DO 16 MK=1,10
  2715.     IF(LSU(MK).EQ.0)GOTO 6
  2716.     IF(LSU(MK).EQ.' ')GOTO 16
  2717.     LWRK(INWRK)=LSU(MK)
  2718.     IF(INWRK.LT.LENGTH)INWRK=INWRK+1
  2719. 16    CONTINUE
  2720. 6    CONTINUE
  2721.     M=M+1
  2722.     IF(M.LE.LSB)GOTO 106
  2723.     GOTO 1
  2724. 2    CONTINUE
  2725. C HERE JUST ANOTHER CHARACTER TO MOVE, DO THE MOVE.
  2726.     LWRK(INWRK)=LIN(INLIN)
  2727.     IF(INLIN.LT.LENGTH)INLIN=INLIN+1
  2728.     IF(INWRK.LT.LENGTH)INWRK=INWRK+1
  2729. 1    CONTINUE
  2730. C COPY BACK OUT TO CMDLIN AFTER FIXUP
  2731.     IF(INWRK.GE.LENGTH)GOTO 3
  2732.     DO 4 N=INWRK,LENGTH
  2733. 4    LWRK(N)=0
  2734. 3    CONTINUE
  2735. C REPLACE COMMAND LINE WITH EDITED STRING FOR ENTRY NOW.
  2736.     DO 5 N=1,LENGTH
  2737. 5    LCMD(N)=LWRK(N)
  2738. 100    CONTINUE
  2739.     RETURN
  2740.     END
  2741. c -h- sign.for    Tue Sep  2 10:58:55 1986    
  2742.     REAL *8 FUNCTION SIGN(VAR)
  2743.     REAL*8 VAR
  2744. C ALWAYS RETURN 1. OR -1. FOR THIS PROGRAM ... NEVER 0.
  2745.     SIGN=1.
  2746.     IF(VAR.LT.0.)SIGN=-1.
  2747.     RETURN
  2748.     END
  2749. c -h- slend.for    Tue Sep  2 10:58:55 1986    
  2750.     SUBROUTINE SLEND(RETCD)
  2751. C COPYRIGHT (C) 1983, 1984 GLENN AND MARY EVERHART
  2752. C ALL RIGHTS RESERVED
  2753. C 60=MAX REAL ROWS
  2754. C 301=MAX REAL COLS
  2755. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  2756. C VBLS AND TYPE DIMENSIONED 60,301
  2757. C **************************************************
  2758. C *                                                *
  2759. C *         SUBROUTINE   SLEND(RETCD)              *
  2760. C *                                                *
  2761. C **************************************************
  2762. C
  2763. C
  2764. C
  2765. C SETS VALUE OF LEND, POINTER TO LAST NON-BLANK CHARACTER
  2766. C IN LINE(80)
  2767. C
  2768. C
  2769. C
  2770. C
  2771. C RETCD VALUE       MEANING
  2772. C
  2773. C    1            NORMAL RETURN
  2774. C    2            ALL BLANKS
  2775. C
  2776. C
  2777. C
  2778. C   SLEND IS CALLED BY CALC
  2779. C
  2780. C VARIABLE    USE
  2781. C
  2782. C  BLANK      ' '
  2783. C    I        INDEXES CHARACTERS IN LINE(80).
  2784. C  LEND       UPON EXIT, POINTS TO THE LAST NON-
  2785. C             BLANK IN LINE(80).
  2786. C  LINE(80)   HOLDS COMMAND LINE.
  2787. C  RETCD      RETURN CODE.  1=NORMAL, 2=ALL BLANKS
  2788. C
  2789. C
  2790. C
  2791. C    SUBROUTINE SLEND(RETCD)
  2792.     InTeGer*4 LEVEL,NONBLK,LEND
  2793.     InTeGer*4 VIEWSW,BASED,RETCD
  2794. C
  2795.     CHARACTER*1 ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ
  2796.     CHARACTER*1 LINE(80)
  2797. C
  2798.     COMMON LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  2799.     COMMON /CONS/ ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  2800. C
  2801. C
  2802. C
  2803. C
  2804.     RETCD=1
  2805.     DO 100 I=1,80
  2806.     IF(LINE(81-I).NE.BLANK)GO TO 200
  2807. 100    CONTINUE
  2808.     RETCD=2
  2809.     RETURN
  2810. 200    LEND=81-I
  2811.     RETURN
  2812.     END
  2813. c -h- sscmp.for    Tue Sep  2 10:58:55 1986    
  2814.     SUBROUTINE SSCMP(LINA,LINB,LENM,ICODE)
  2815.     DIMENSION LINA(1),LINB(1)
  2816.     CHARACTER*1 LINA,LINB
  2817.     ICODE=1
  2818.     DO 1 N=1,LENM
  2819. c    IF(ICHAR(LINA(N)).EQ.0.OR.ICHAR(LINB(N)).EQ.0)GOTO 2
  2820.     IF(ICHAR(LINA(N)).NE.ICHAR(LINB(N)))ICODE=0
  2821.     IF(ICODE.NE.1)GOTO 2
  2822. 1    CONTINUE
  2823. 2    CONTINUE
  2824.     RETURN
  2825.     END
  2826. c -h- sstr.for    Tue Sep  2 10:58:55 1986    
  2827.     SUBROUTINE SSTR(CMDLIN,LA,N,LE,FORM)
  2828.     CHARACTER*1 CMDLIN(132),FORM(128),NBF(8)
  2829.     InTeGer*4 LA,N,LE
  2830.     InTeGer*4 VLEN(9),TYPE(1,1)
  2831.     CHARACTER*1 AVBLS(20,27)
  2832.     REAL*8 XVBLS(1,1),XX,VP,TMP
  2833.     COMMON/V/TYPE,AVBLS,XVBLS,VLEN
  2834.     NI=N
  2835.     N=N+2
  2836. C LOOK FOR V1,V2 VARIABLES; THEN GET NAME TO FILL IN.
  2837.     LAA=N
  2838.     LEE=LE
  2839.     CALL VARSCN(CMDLIN,LAA,LEE,LSTC,I1,I2,IVLD)
  2840.     IF(IVLD.LE.0)GOTO 990
  2841. C    XX=XVBLS(I1,I2)
  2842.     CALL XVBLGT(I1,I2,XX)
  2843.     VP=128.D0**7
  2844.     DO 1 NN=1,8
  2845.     TMP=DINT(XX/VP)
  2846.     NBF(NN)=CHAR(IDINT(TMP))
  2847.     VP=VP/128.D0
  2848.     XX=XX-(128.D0*TMP)
  2849. 1    CONTINUE
  2850. C NOW NBF HAS 8 BYTES OF DATA CORRESPONDING TO DE-HASHED
  2851. C STRING. COPY TO FORM.
  2852.     NL=NI
  2853.     DO 2 NN=1,8
  2854.     FORM(NL)=NBF(NN)
  2855.     IF(NN.GE.1)NL=NL+1
  2856. 2    CONTINUE
  2857. C NOW ADJUST CMDLIN AND SET RETURN UP FOR ORIGINAL LENGTH FIXUP
  2858. C NOTE NI IS WHERE N WAS ON START (INDEX OF _)
  2859. C AND LSTC IS NEXT CHAR AFTER VARIABLE ON CMDLIN
  2860. C AND NL IS NEXT CHAR IN FORM. ASSUME THAT FORM IS NOW SHORTER
  2861. C AND MOVE CMDLIN DOWN.
  2862.     N=NL
  2863.     LE=LE-LSTC+NL
  2864.     DO 401 M=N,LE
  2865.     CMDLIN(M)=CMDLIN(M+LSTC-NL)
  2866. 401    CONTINUE
  2867. C HOPE ALL'S WELL NOW...
  2868.     RETURN
  2869. 990    FORM(N)=CMDLIN(N)
  2870.     RETURN
  2871.     END
  2872. c -h- strcmp.for    Tue Sep  2 10:58:55 1986    
  2873.     SUBROUTINE  STRCMP(NAME,LENGTH,RETCD)
  2874. C COPYRIGHT (C) 1983 GLENN EVERHART
  2875. C ALL RIGHTS RESERVED
  2876. C 60=MAX REAL ROWS
  2877. C 301=MAX REAL COLS
  2878. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  2879. C VBLS AND TYPE DIMENSIONED 60,301
  2880. C **************************************************
  2881. C *                                                *
  2882. C *   SUBROUTINE STRCMP(NAME,LENGTH,RETCD)         *
  2883. C *                                                *
  2884. C **************************************************
  2885. C
  2886. C
  2887. C  STRCMP LOOKS PAST BLANKS FOR THE NAME HELD BY NAME(1),...,NAME(LENGTH)
  2888. C  THE RETURN CODE RETCD INDICATES SUCCESS OR FAILURE:
  2889. C
  2890. C    1=MATCH
  2891. C    2=FAILURE
  2892. C
  2893. C  UPON EXIT, COMMON VARIABLE NONBLK
  2894. C         IF SUCCESSFUL, POINTS TO ONE BEYOND THE LAST CHARACTER SCANNED
  2895. C                 FOR MATCH
  2896. C         IF FAILURE, UNCHANGED
  2897. C
  2898. C
  2899. C
  2900. C  MODIFICATION CLASSES: M2
  2901. C
  2902. C
  2903. C
  2904. C  STRCMP CALLS GETNNB TO GET THE NEXT NON-BLANK FROM LINE(80)
  2905. C
  2906. C  STRCMP IS CALLED BY CMND
  2907. C
  2908. C
  2909. C
  2910. C
  2911. C VARIABLE       USE
  2912. C
  2913. C   I2        INDEXES NAME(LENGTH).
  2914. C   IS        HOLDS VALUE OF NONBLANK IN CASE AN ERROR OCCURS
  2915. C             AND IT IS NECESSARY TO RESTORE THE VALUE.
  2916. C   LENGTH    HOLDS THE LENGTH OF VECTOR NAME.
  2917. C   NONBLK    POINTER FOR COMMAND LINE HELD BY LINE(80).
  2918. C   RETCD     HOLDS RETURN CODE.  1=MATCH,  2=FAILURE
  2919. C
  2920. C
  2921. C
  2922. C
  2923. C    SUBROUTINE  STRCMP(NAME,LENGTH,RETCD)
  2924.     InTeGer*4 LENGTH
  2925.     InTeGer*4 LEVEL,NONBLK,LEND
  2926.     InTeGer*4  RETCD,VIEWSW,BASED
  2927. C
  2928.     CHARACTER*1  LINE(80),NAME(LENGTH)
  2929.     CHARACTER*1 ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ
  2930. C
  2931.     COMMON  /CONS/ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  2932.     COMMON  LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  2933. C
  2934. C UPON ENTRANCE, NONBLK POINTS TO THE FIRST CHARACTER
  2935. C IN NAME, COMPARE LOOKS PAST THIS TO THE NEXT CHARACTER
  2936. C SINCE CMND HAS ALREADY IDENTIFIED THAT FIRST CHARACTER
  2937. C IN THE COMMAND NAME (AFTER THE ASTERISK).
  2938.     IS=NONBLK
  2939.     CALL GETNNB(IPT,RETCD)
  2940.     GO TO (10,999),RETCD
  2941. C ON EXIT NONBLK POINTS TO LAST CHARACTER IN NAME
  2942. C
  2943. C
  2944. 10    DO 100 I2=1,LENGTH
  2945.     CALL GETNNB(IPT,RETCD)
  2946.     GO TO (20,999),RETCD
  2947.     STOP 20
  2948. 20    NONBLK=IPT
  2949.     IF(NAME(I2).NE.LINE(NONBLK))GOTO 999
  2950. 100    CONTINUE
  2951.     RETCD=1
  2952.     RETURN
  2953. C
  2954. C
  2955. C NO MATCH
  2956. 999    RETCD=2
  2957. C IF ERROR, RESTORE VALUE OF NONBLK
  2958.     NONBLK=IS
  2959.     RETURN
  2960.     END
  2961. c -h- svbl.for    Tue Sep  2 10:58:55 1986    
  2962.     SUBROUTINE SVBL(CMDLIN,LA,N,LE,FORM)
  2963.     InTeGer*4 VLEN(9),TYPE(1,1)
  2964.     CHARACTER*1 AVBLS(20,27)
  2965.     REAL*8 XVBLS(1,1)
  2966.     COMMON/V/TYPE,AVBLS,XVBLS,VLEN
  2967.     CHARACTER*1 CMDLIN(132),FORM(128),NBF(8)
  2968.     CHARACTER*3 NBF3
  2969.     EQUIVALENCE(NBF3(1:1),NBF(5))
  2970.     InTeGer*4 LA,N,LE
  2971.     NI=N
  2972.     N=N+2
  2973. C LOOK FOR V1,V2 VARIABLES; THEN GET NAME TO FILL IN.
  2974.     LAA=N
  2975.     LEE=LE
  2976.     CALL VARSCN(CMDLIN,LAA,LEE,LSTC,I1,I2,IVLD)
  2977.     IF(IVLD.LE.0)GOTO 990
  2978.     LAA=LSTC+1
  2979. C ACCEPT ANY DELIMITER
  2980.     LEE=LE
  2981.     CALL VARSCN(CMDLIN,LAA,LEE,LSTC,J1,J2,IVLD)
  2982.     IF(IVLD.LE.0)GOTO 990
  2983. C    XX=XVBLS(I1,I2)
  2984.     CALL XVBLGT(I1,I2,XX)
  2985. C XX IS COL #
  2986. C    XY=XVBLS(J1,J2)-1.0
  2987.     CALL XVBLGT(J1,J2,XY)
  2988.     IF(XX.LE..99.OR.XX.GT.DFLOAT(RRW))GOTO 990
  2989.     IF(XY.LE..99.OR.XY.GT.DFLOAT(RCL))GOTO 990
  2990.     IC=XX
  2991.     CALL IN2AS(IC,NBF)
  2992.     IR=XY
  2993.     WRITE(NBF3(1:3),300)IR
  2994. C    ENCODE(3,300,NBF(5))IR
  2995. 300    FORMAT(BZ,I3)
  2996.     NL=NI
  2997. C FILL IN DECODED VARIABLE NAME, ZOTTING OUT EXTRA SPACES.
  2998.     DO 400 NN=1,7
  2999.     FORM(NL)=NBF(NN)
  3000.     IF(FORM(NL).GT.64)NL=NL+1
  3001. 400    CONTINUE
  3002. C NOW ADJUST CMDLIN AND SET RETURN UP FOR ORIGINAL LENGTH FIXUP
  3003. C NOTE NI IS WHERE N WAS ON START (INDEX OF _)
  3004. C AND LSTC IS NEXT CHAR AFTER 2ND VARIABLE ON CMDLIN
  3005. C AND NL IS NEXT CHAR IN FORM. ASSUME THAT FORM IS NOW SHORTER
  3006. C AND MOVE CMDLIN DOWN.
  3007.     N=NL
  3008.     LE=LE-LSTC+NL
  3009.     DO 401 M=N,LE
  3010.     CMDLIN(M)=CMDLIN(M+LSTC-NL)
  3011. 401    CONTINUE
  3012. C HOPE ALL'S WELL NOW...
  3013.     RETURN
  3014. 990    CONTINUE
  3015.     FORM(N)=CMDLIN(N)
  3016.     RETURN
  3017.     END
  3018. c -h- swrt.for    Tue Sep  2 10:58:55 1986    
  3019. C
  3020. C SWRT - WRITE VARIABLE LENGTH STRING TO SCREEN WITHOUT
  3021. C RECORD TERMINATION.
  3022. C COPYRIGHT GLENN C EVERHART 1984
  3023. C ALL RIGHTS RESERVED
  3024. C *** Don't use for normal Amiga stuff, but have available in case
  3025. C *** it should be handy someplace...
  3026. C
  3027. C
  3028. ccc    SUBROUTINE SWRT(STRING,LENGTH)
  3029. ccc    CHARACTER*1 STRING(127)
  3030. ccc    INTEGER LENGTH
  3031. cccC DUMP OUT ALL WE CAN..
  3032. ccc    CHARACTER*9 SFM
  3033. ccc    CHARACTER*1 SFMX(9)
  3034. ccc    CHARACTER*3 SNM
  3035. ccc    EQUIVALENCE(SNM,SFMX(2))
  3036. ccc    EQUIVALENCE (SFMX(1),SFM)
  3037. cccC HERE ARE THE BUILT IN FORMATS. NOTE WE FILL IN THE
  3038. cccC REPEAT COUNT AT RUNTIME FOR THE TEXT TO BE WRITTEN.
  3039. cccC NOTE ALSO THAT THE 1ST CHAR IS A # SIGN TO SHOW UP PROBLEMS.
  3040. cccC FORMATS ARE (nnnA1,\)
  3041. cccC COMPRISING 13 CHARACTERS IN ALL.
  3042. ccc    DATA SFM/'(001A1,\)'/
  3043. cccC NOTE WE JUST FILL IN THE LENGTH AND WRITE TO SCREEN USING
  3044. cccC SFM AS A RUNTIME FORMAT.
  3045. cccC
  3046. ccc    IF(LENGTH.LE.0)RETURN
  3047. ccc    WRITE(SNM,1)LENGTH
  3048. ccc1    FORMAT(BZ,I3)
  3049. cccC WRITE ON UNIT 6 WHICH IS OUR SPECIALLY OPENED CONSOLE OUTPUT UNIT
  3050. cccC (VIA EXPLICIT OPEN IN MAIN PROGRAM)
  3051. ccc    WRITE(11,SFM)(STRING(II),II=1,LENGTH)
  3052. ccc    RETURN
  3053. ccc    END
  3054.     SUBROUTINE VWRT(STRING,LENGTH)
  3055. C VWRT is like SWRT but writes to lun 11 window instead.
  3056.     CHARACTER*1 STRING(127)
  3057.     INTEGER LENGTH
  3058. C DUMP OUT ALL WE CAN..
  3059.     IF(LENGTH.LE.0)RETURN
  3060. C WRITE ON UNIT 11 WHICH IS OUR SPECIALLY OPENED CONSOLE OUTPUT UNIT
  3061. C (VIA EXPLICIT OPEN IN MAIN PROGRAM)
  3062.     WRITE(18,777)(STRING(II),II=1,LENGTH)
  3063. 777    format(1X,127A1)
  3064.     RETURN
  3065.     END
  3066.